<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="Content-Language" content="zh-CN"><title>systemd.unit
  中文手册 [金步国]</title><style>
@font-face { font-family: "JinBuGuoWebMono"; src: url("http://www.jinbuguo.com/d/mono.ttf") format("truetype"); }
* { font-family: "JinBuGuoWebMono", "Ubuntu Mono", "Consolas", "Menlo", monospace; }
body { margin:10px; }
h1 { text-align:center; background:#ddd; }
h2#auth_name { text-align:center; margin: 10px 5%; }

    a.headerlink {
      color: #c60f0f;
      font-size: 0.8em;
      padding: 0 4px 0 4px;
      text-decoration: none;
      visibility: hidden;
    }

    a.headerlink:hover {
      background-color: #c60f0f;
      color: white;
    }

    h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, dt:hover > a.headerlink {
      visibility: visible;
    }
</style><script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><h1>systemd.unit 中文手册</h1><h2 id="auth_name">译者：<strong><a href="http://www.jinbuguo.com/">金步国</a></strong></h2><hr><h3>版权声明</h3><p>本文译者是一位开源理念的坚定支持者，所以本文虽然不是软件，但是遵照开源的精神发布。</p><ul><li>无担保：本文译者不保证译文内容准确无误，亦不承担任何由于使用此文档所导致的损失。</li><li>自由使用：任何人都可以自由的<u>阅读/链接/打印</u>此文档，无需任何附加条件。</li><li>名誉权：任何人都可以自由的<u>转载/引用/再创作</u>此文档，但必须保留译者署名并注明出处。</li></ul><h3>其他作品</h3><p>本文译者十分愿意与他人分享劳动成果，如果你对我的其他翻译作品或者技术文章有兴趣，可以在如下位置查看现有的作品集：</p><ul><li><a href="http://www.jinbuguo.com/">金步国作品集</a> [ <a href="http://www.jinbuguo.com/">http://www.jinbuguo.com/</a> ]</li></ul><h3>联系方式</h3><p>由于译者水平有限，因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好)，请来信指出，任何提高译文质量的建议我都将虚心接纳。</p><ul><li>Email(QQ)：70171448在QQ邮箱</li></ul><hr><a href="systemd.index.html">手册索引</a> ·
  <a href="systemd.directives.html">指令索引</a><span style="float:right">systemd-241</span><hr><div class="refentry"><a name="systemd.unit"></a><div class="titlepage"></div><div class="refnamediv"><h2>名称</h2><p>systemd.unit — 单元配置</p></div><div class="refsynopsisdiv"><h2>大纲</h2><p><code class="filename"><em class="replaceable"><code>service</code></em>.service</code>,
    <code class="filename"><em class="replaceable"><code>socket</code></em>.socket</code>,
    <code class="filename"><em class="replaceable"><code>device</code></em>.device</code>,
    <code class="filename"><em class="replaceable"><code>mount</code></em>.mount</code>,
    <code class="filename"><em class="replaceable"><code>automount</code></em>.automount</code>,
    <code class="filename"><em class="replaceable"><code>swap</code></em>.swap</code>,
    <code class="filename"><em class="replaceable"><code>target</code></em>.target</code>,
    <code class="filename"><em class="replaceable"><code>path</code></em>.path</code>,
    <code class="filename"><em class="replaceable"><code>timer</code></em>.timer</code>,
    <code class="filename"><em class="replaceable"><code>slice</code></em>.slice</code>,
    <code class="filename"><em class="replaceable"><code>scope</code></em>.scope</code></p><div class="refsect2"><a name="id-1.4.2"></a><h3 id="系统单元">系统单元<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%E7%B3%BB%E7%BB%9F%E5%8D%95%E5%85%83">¶</a></h3><div class="literallayout"><p><code class="filename">/etc/systemd/system.control/*</code><br>
<code class="filename">/run/systemd/system.control/*</code><br>
<code class="filename">/run/systemd/transient/*</code><br>
<code class="filename">/run/systemd/generator.early/*</code><br>
<code class="filename">/etc/systemd/system/*</code><br>
<code class="filename">/etc/systemd/systemd.attached/*</code><br>
<code class="filename">/run/systemd/system/*</code><br>
<code class="filename">/run/systemd/systemd.attached/*</code><br>
<code class="filename">/run/systemd/generator/*</code><br>
<code class="filename">…</code><br>
<code class="filename">/usr/lib/systemd/system/*</code><br>
<code class="filename">/run/systemd/generator.late/*</code></p></div></div><div class="refsect2"><a name="id-1.4.3"></a><h3 id="用户单元(私有用户单元+全局用户单元)">用户单元(私有用户单元+全局用户单元)<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%E7%94%A8%E6%88%B7%E5%8D%95%E5%85%83(%E7%A7%81%E6%9C%89%E7%94%A8%E6%88%B7%E5%8D%95%E5%85%83+%E5%85%A8%E5%B1%80%E7%94%A8%E6%88%B7%E5%8D%95%E5%85%83)">¶</a></h3><div class="literallayout"><p><code class="filename">~/.config/systemd/user.control/*</code><br>
<code class="filename">$XDG_RUNTIME_DIR/systemd/user.control/*</code><br>
<code class="filename">$XDG_RUNTIME_DIR/systemd/transient/*</code><br>
<code class="filename">$XDG_RUNTIME_DIR/systemd/generator.early/*</code><br>
<code class="filename">~/.config/systemd/user/*</code><br>
<code class="filename">/etc/systemd/user/*</code><br>
<code class="filename">$XDG_RUNTIME_DIR/systemd/user/*</code><br>
<code class="filename">/run/systemd/user/*</code><br>
<code class="filename">$XDG_RUNTIME_DIR/systemd/generator/*</code><br>
<code class="filename">~/.local/share/systemd/user/*</code><br>
<code class="filename">…</code><br>
<code class="filename">/usr/lib/systemd/user/*</code><br>
<code class="filename">$XDG_RUNTIME_DIR/systemd/generator.late/*</code></p></div></div></div><div class="refsect1"><a name="id-1.5"></a><h2 id="描述">描述<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%E6%8F%8F%E8%BF%B0">¶</a></h2><p>单元文件是 ini 风格的纯文本文件。
    封装了有关下列对象的信息：
    服务(service)、套接字(socket)、设备(device)、挂载点(mount)、自动挂载点(automount)、
    启动目标(target)、交换分区或交换文件(swap)、被监视的路径(path)、任务计划(timer)、
    资源控制组(slice)、一组外部创建的进程(scope)。参见
    <a href="systemd.syntax.html#"><span class="citerefentry"><span class="refentrytitle">systemd.syntax</span>(5)</span></a>
    以了解通用配置语法。</p><p>本手册列出了各类单元所共有的配置选项(亦称"配置指令"或"单元属性")，
    这些选项位于单元文件的 [Unit]
    或 [Install] 小节。</p><p>除了通用的 [Unit] 与 [Install] 小节之外，
    每种单元还有各自
    专属的小节。
    详见各种单元的手册：
    <a href="systemd.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd.service</span>(5)</span></a>,
    <a href="systemd.socket.html#"><span class="citerefentry"><span class="refentrytitle">systemd.socket</span>(5)</span></a>,
    <a href="systemd.device.html#"><span class="citerefentry"><span class="refentrytitle">systemd.device</span>(5)</span></a>,
    <a href="systemd.mount.html#"><span class="citerefentry"><span class="refentrytitle">systemd.mount</span>(5)</span></a>,
    <a href="systemd.automount.html#"><span class="citerefentry"><span class="refentrytitle">systemd.automount</span>(5)</span></a>,
    <a href="systemd.swap.html#"><span class="citerefentry"><span class="refentrytitle">systemd.swap</span>(5)</span></a>,
    <a href="systemd.target.html#"><span class="citerefentry"><span class="refentrytitle">systemd.target</span>(5)</span></a>,
    <a href="systemd.path.html#"><span class="citerefentry"><span class="refentrytitle">systemd.path</span>(5)</span></a>,
    <a href="systemd.timer.html#"><span class="citerefentry"><span class="refentrytitle">systemd.timer</span>(5)</span></a>,
    <a href="systemd.slice.html#"><span class="citerefentry"><span class="refentrytitle">systemd.slice</span>(5)</span></a>,
    <a href="systemd.scope.html#"><span class="citerefentry"><span class="refentrytitle">systemd.scope</span>(5)</span></a>.
    </p><p>单元文件将会从多个编译时设定的目录中加载，
    下一小节将会详细解释。</p><p>单元文件可以通过一个"实例名"参数从"模板文件"构造出来(这个过程叫"实例化")。
    "模板文件"(也称"模板单元"或"单元模板")是定义一系列同类型单元的基础。
    模板文件的名称必须以 "<code class="literal">@</code>" 结尾(在类型后缀之前)。
    通过实例化得到的单元，其完整的单元名称是在模板文件的类型后缀与
     "<code class="literal">@</code>" 之间插入实例名称形成的。在通过实例化得到的单元内部，
    可以使用 "<code class="literal">%i</code>" 以及其他说明符来引用实例参数，
    详见后文。</p><p>除了手册中列出的选项之外，单元文件还可以包含更多其他选项。
    无法识别的选项不会中断单元文件的加载，但是 systemd 会输出一条警告日志。
    如果选项或者小节的名字以 <code class="option">X-</code> 开头，
    那么 systemd 将会完全忽略它。
    以 <code class="option">X-</code> 开头的小节中的选项没必要再以 <code class="option">X-</code> 开头，
    因为整个小节都已经被忽略。
    应用程序可以利用这个特性在单元文件中包含额外的信息。</p><p>如果想要给一个单元赋予别名，那么可以按照需求，在系统单元目录或用户单元目录中，
    创建一个软连接(以别名作为文件名)，并将其指向该单元的单元文件。
    例如 <code class="filename">systemd-networkd.service</code> 在安装时就通过
     <code class="filename">/usr/lib/systemd/system/dbus-org.freedesktop.network1.service</code> 软连接创建了
    <code class="filename">dbus-org.freedesktop.network1.service</code> 别名。
    此外，还可以直接在单元文件的 [Install] 小节中使用 <code class="varname">Alias=</code> 创建别名。
    注意，单元文件中设置的别名会随着单元的启用(enable)与禁用(disable)而生效和失效，
    也就是别名软连接会随着单元的启用(enable)与禁用(disable)而创建与删除。
    例如，因为 <code class="filename">reboot.target</code> 单元文件中含有
    <code class="varname">Alias=ctrl-alt-del.target</code> 的设置，所以启用(enable)此单元之后，按下
    CTRL+ALT+DEL 组合键将会导致启动该单元。单元的别名可以用于 <span class="command"><strong>enable</strong></span>,
    <span class="command"><strong>disable</strong></span>, <span class="command"><strong>start</strong></span>, <span class="command"><strong>stop</strong></span>,
    <span class="command"><strong>status</strong></span>, … 这些命令中，也可以用于 <code class="varname">Wants=</code>,
    <code class="varname">Requires=</code>, <code class="varname">Before=</code>, <code class="varname">After=</code>, … 这些依赖关系选项中。
    但是务必注意，不可将单元的别名用于 <span class="command"><strong>preset</strong></span> 命令中。
    再次提醒，通过 <code class="varname">Alias=</code> 设置的别名仅在单元被启用(enable)之后才会生效。</p><p>对于例如 <code class="filename">foo.service</code> 这样的单元文件，
    可以同时存在对应的 <code class="filename">foo.service.wants/</code> 与
    <code class="filename">foo.service.requires/</code> 目录，
    其中可以放置许多指向其他单元文件的软连接。
    软连接所指向的单元将会被隐含的添加到 <code class="filename">foo.service</code> 相应的
     <code class="varname">Wants=</code> 与 <code class="varname">Requires=</code> 依赖中。
    这样就可以方便的为单元添加依赖关系，而无需修改单元文件本身。
    向 <code class="filename">.wants/</code> 与 <code class="filename">.requires/</code> 目录中添加软连接的首选方法是使用
     <a href="systemctl.html#"><span class="citerefentry"><span class="refentrytitle">systemctl</span>(1)</span></a> 的 <span class="command"><strong>enable</strong></span> 命令，
    它会读取单元文件的 [Install] 
    小节(详见后文)。</p><p>对于例如 <code class="filename">foo.service</code> 这样的单元文件，可以同时存在对应的 <code class="filename">foo.service.d/</code> 目录，
    当解析完主单元文件之后，目录中所有以 "<code class="literal">.conf</code>" 结尾的文件，都会被按照文件名的字典顺序，依次解析(相当于依次附加到主单元文件的末尾)。
    这样就可以方便的修改单元的设置，或者为单元添加额外的设置，而无需修改单元文件本身。
    注意，配置片段("<code class="literal">.conf</code>" 文件)必须包含明确的小节头(例如 "<code class="literal">[Service]</code>" 之类)。
    对于从模板文件实例化而来的单元，会优先读取与此实例对应的 "<code class="literal">.d/</code>" 目录(例如
    "<code class="literal">foo@bar.service.d/</code>")中的配置片段("<code class="literal">.conf</code>" 文件)，
    然后才会读取与模板对应的 "<code class="literal">.d/</code>" 目录(例如 "<code class="literal">foo@.service.d/</code>")中的配置片段("<code class="literal">.conf</code>" 文件)。
    对于名称中包含连字符("<code class="literal">-</code>")的单元，将会按特定顺序依次在一组(而不是一个)目录中搜索单元配置片段。
    例如对于
    <code class="filename">foo-bar-baz.service</code> 单元来说，将会依次在
    <code class="filename">foo-.service.d/</code>, <code class="filename">foo-bar-.service.d/</code>, <code class="filename">foo-bar-baz.service.d/</code>
    目录下搜索单元配置片段。这个机制可以方便的为一组相关单元(单元名称的前缀都相同)定义共同的单元配置片段，
    特别适合应用于 mount, automount, slice 类型的单元，
    因为这些单元的命名规则就是基于连字符构建的。
    注意，在前缀层次结构的下层目录中的单元配置片段，会覆盖上层目录中的同名文件，
    也就是 <code class="filename">foo-bar-.service.d/10-override.conf</code> 会覆盖(取代)
    <code class="filename">foo-.service.d/10-override.conf</code> 文件。</p><p>存放配置片段("<code class="literal">.conf</code>" 文件)的 "<code class="literal">.d/</code>" 目录，
    除了可以放置在 <code class="filename">/etc/systemd/{system,user}</code> 目录中，
    还可以放置在 <code class="filename">/usr/lib/systemd/{system,user}</code> 与 <code class="filename">/run/systemd/{system,user}</code> 目录中。
    虽然在优先级上，<code class="filename">/etc</code> 中的配置片段优先级最高、<code class="filename">/run</code> 中的配置片段优先级居中、
    <code class="filename">/usr/lib</code> 中的配置片段优先级最低。但是这仅对同名配置片段之间的覆盖关系有意义。
    因为所有 "<code class="literal">.d/</code>" 目录中的配置片段，无论其位于哪个目录，
    都会被按照文件名的字典顺序，依次覆盖单元文件中的设置(相当于依次附加到主单元文件的末尾)。</p><p>注意，虽然 systemd 为明确设置单元之间的依赖关系提供了灵活的方法，
    但是我们反对使用这些方法，你应该仅在万不得已的时候才使用它。
    我们鼓励你使用基于 D-Bus 或 socket 的启动机制，
    以将单元之间的依赖关系隐含化，
    从而得到一个更简单也更健壮的系统。</p><p>如上所述，单元可以从模板实例化而来。
    这样就可以用同一个模板文件衍生出多个单元。
    当 systemd 查找单元文件时，会首先查找与单元名称完全吻合的单元文件，
    如果没有找到，并且单元名称中包含 "<code class="literal">@</code>" 字符，
    那么 systemd 将会继续查找拥有相同前缀的模板文件，
    如果找到，那么将从这个模板文件实例化一个单元来使用。
    例如，对于 <code class="filename">getty@tty3.service</code> 单元来说，
    其对应的模板文件是 <code class="filename">getty@.service</code>
    (也就是去掉 "<code class="literal">@</code>" 与后缀名之间的部分)。</p><p>可以在模板文件内部
    通过 "<code class="literal">%i</code>"
    引用实例字符串(也就是上例中的"tty3")，
    详见后面的小节。</p><p>如果一个单元文件的大小为零字节或者是指向
     <code class="filename">/dev/null</code> 的软连接，
    那么它的所有相关配置都将被忽略。同时，该单元将被标记为 
    "<code class="literal">masked</code>" 状态，并且无法被启动。
    这样就可以
    彻底屏蔽一个单元(即使手动启动也不行)。</p><p>单元文件的格式在未来将保持稳定(参见
    <a class="ulink" href="https://www.freedesktop.org/wiki/Software/systemd/InterfaceStabilityPromise" target="_top">Interface
    Stability Promise</a>)。</p></div><div class="refsect1"><a name="id-1.6"></a><h2 id="单元名称中的字符转义">单元名称中的字符转义<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%E5%8D%95%E5%85%83%E5%90%8D%E7%A7%B0%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E8%BD%AC%E4%B9%89">¶</a></h2><p>有时需要将任意字符串(可以包含任意非NUL字符)转化为合法有效的单元名称。
    为了达成这个目标，必须对特殊字符进行转义。
    一个典型的例子是，为了便于识别，需要将某些单元的名称精确对应到文件系统上的对象。
    例如将 <code class="filename">dev-sda.device</code> 与
     <code class="filename">/dev/sda</code> 精确对应。</p><p>转义规则如下：(1)将 "<code class="literal">/</code>" 替换为 "<code class="literal">-</code>" ；
    (2)保持 ASCII字母与数字 不变； (3)保持 "<code class="literal">_</code>" 不变；
    (4)仅当 "<code class="literal">.</code>" 是首字符时将其替换为"\x2e"，否则保持不变；
    (5)将上述 1~4 之外的所有其他字符替换为C风格的"\x??"转义序列。</p><p>对于文件系统路径来说，"/"的转义规则略有不同，具体说来就是：
    (1)单纯的根目录"/"将被替换为"-"；
    (2)将其他路径首尾的"/"删除后再将剩余的"/"替换为"-"。
    例如 <code class="filename">/foo//bar/baz/</code> 将被转义为 "<code class="literal">foo-bar-baz</code>"</p><p>只要知道转义对象是否为文件系统路径，
    这种转义规则就是完全可逆的。
    <a href="systemd-escape.html#"><span class="citerefentry"><span class="refentrytitle">systemd-escape</span>(1)</span></a>
    可以用来转义与还原字符串。使用 <span class="command"><strong>systemd-escape --path</strong></span> 转义文件系统路径，
    使用 <span class="command"><strong>systemd-escape</strong></span> 转义其他字符串。</p></div><div class="refsect1"><a name="id-1.7"></a><h2 id="自动依赖">自动依赖<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%E8%87%AA%E5%8A%A8%E4%BE%9D%E8%B5%96">¶</a></h2><div class="refsect2"><a name="id-1.7.2"></a><h3 id="隐含依赖">隐含依赖<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%E9%9A%90%E5%90%AB%E4%BE%9D%E8%B5%96">¶</a></h3><p>许多依赖关系是根据单元的类型与设置自动隐含创建的。
      这些隐含的依赖关系可以让单元文件的内容更加简洁清爽。
      对于各类单元的隐含依赖关系，
      可以参考对应手册页的"隐含依赖"小节。</p><p>例如，带有 <code class="varname">Type=dbus</code> 的 service 单元
      将会自动隐含 <code class="varname">Requires=dbus.socket</code>
      与 <code class="varname">After=dbus.socket</code> 依赖。详见
      <a href="systemd.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd.service</span>(5)</span></a>
      手册。</p></div><div class="refsect2"><a name="id-1.7.3"></a><h3 id="默认依赖">默认依赖<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%E9%BB%98%E8%AE%A4%E4%BE%9D%E8%B5%96">¶</a></h3><p>默认依赖与隐含依赖类似，不同之处在于默认依赖可以使用
      <code class="varname">DefaultDependencies=</code> 选项进行开关(默认值 <code class="varname">yes</code>
      表示开启默认依赖，而设为 <code class="varname">no</code> 则表示关闭默认依赖)，
      而隐含依赖永远有效。
      对于各类单元的默认依赖关系，可以参考对应手册页的"默认依赖"小节。</p><p>例如，除非明确设置了 <code class="varname">DefaultDependencies=no</code> ，否则 target 单元将会默认添加对通过
      <code class="varname">Wants=</code> 或 <code class="varname">Requires=</code> 汇聚的单元
      的 <code class="varname">After=</code> 依赖。
      详见
      <a href="systemd.target.html#"><span class="citerefentry"><span class="refentrytitle">systemd.target</span>(5)</span></a>
      手册。注意，可以通过设置
      <code class="varname">DefaultDependencies=no</code> 来关闭默认行为。</p></div></div><div class="refsect1"><a name="id-1.8"></a><h2 id="单元目录(单元文件加载路径)">单元目录(单元文件加载路径)<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%E5%8D%95%E5%85%83%E7%9B%AE%E5%BD%95(%E5%8D%95%E5%85%83%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E8%B7%AF%E5%BE%84)">¶</a></h2><p>systemd 将会从一组在编译时设定好的"单元目录"中加载单元文件(详见下面的两个表格)，
    并且较先列出的目录拥有较高的优先级(细节见后文)。
    也就是说，高优先级目录中的文件，
    将会覆盖低优先级目录中的同名文件。</p><p>如果设置了 <code class="varname">$SYSTEMD_UNIT_PATH</code> 环境变量，
    那么它将会取代预设的单元目录。
    如果 <code class="varname">$SYSTEMD_UNIT_PATH</code> 以
     "<code class="literal">:</code>" 结尾，
    那么预设的单元目录将会被添加到该变量值的末尾。</p><div class="table"><a name="id-1.8.4"></a><p class="title"><b>表 1. 
        当 systemd 以系统实例(<code class="option">--system</code>)运行时，加载单元的先后顺序(较前的目录优先级较高)：
      </b></p><div class="table-contents"><table class="table" summary="
        当 systemd 以系统实例(--system)运行时，加载单元的先后顺序(较前的目录优先级较高)：
      " border="1"><colgroup><col class="path"><col class="expl"></colgroup><thead><tr><th>系统单元目录</th><th>描述</th></tr></thead><tbody><tr><td><code class="filename">/etc/systemd/system.control</code></td><td>通过 dbus API 创建的永久系统单元</td></tr><tr><td><code class="filename">/run/systemd/system.control</code></td><td>通过 dbus API 创建的临时系统单元</td></tr><tr><td><code class="filename">/run/systemd/transient</code></td><td>动态配置的临时单元(系统与全局用户共用)</td></tr><tr><td><code class="filename">/run/systemd/generator.early</code></td><td>生成的高优先级单元(系统与全局用户共用)(参见 <a href="systemd.generator.html#"><span class="citerefentry"><span class="refentrytitle">systemd.generator</span>(7)</span></a> 手册中对 <em class="replaceable"><code>early-dir</code></em> 的说明)</td></tr><tr><td><code class="filename">/etc/systemd/system</code></td><td>本地配置的系统单元</td></tr><tr><td><code class="filename">/run/systemd/system</code></td><td>运行时配置的系统单元</td></tr><tr><td><code class="filename">/run/systemd/generator</code></td><td>生成的中优先级系统单元(参见 <a href="systemd.generator.html#"><span class="citerefentry"><span class="refentrytitle">systemd.generator</span>(7)</span></a> 手册中对 <em class="replaceable"><code>normal-dir</code></em> 的说明)</td></tr><tr><td><code class="filename">/usr/local/lib/systemd/system</code></td><td>本地软件包安装的系统单元</td></tr><tr><td><code class="filename">/usr/lib/systemd/system</code></td><td>发行版软件包安装的系统单元</td></tr><tr><td><code class="filename">/run/systemd/generator.late</code></td><td>生成的低优先级系统单元(参见 <a href="systemd.generator.html#"><span class="citerefentry"><span class="refentrytitle">systemd.generator</span>(7)</span></a> 手册中对 <em class="replaceable"><code>late-dir</code></em> 的说明)</td></tr></tbody></table></div></div><br class="table-break"><div class="table"><a name="id-1.8.5"></a><p class="title"><b>表 2. 
        当 systemd 以用户实例(<code class="option">--user</code>)运行时，加载单元的先后顺序(较前的目录优先级较高)：
      </b></p><div class="table-contents"><table class="table" summary="
        当 systemd 以用户实例(--user)运行时，加载单元的先后顺序(较前的目录优先级较高)：
      " border="1"><colgroup><col class="path"><col class="expl"></colgroup><thead><tr><th>用户单元目录</th><th>描述</th></tr></thead><tbody><tr><td><code class="filename">$XDG_CONFIG_HOME/systemd/user.control</code> 或 <code class="filename">~/.config/systemd/user.control</code></td><td>通过 dbus API 创建的永久私有用户单元(仅在未设置 <code class="varname">$XDG_CONFIG_HOME</code> 时才使用 <code class="filename">~/.config</code> 来替代)</td></tr><tr><td><code class="filename">$XDG_RUNTIME_DIR/systemd/user.control</code></td><td>通过 dbus API 创建的临时私有用户单元</td></tr><tr><td><code class="filename">/run/systemd/transient</code></td><td>动态配置的临时单元(系统与全局用户共用)</td></tr><tr><td><code class="filename">/run/systemd/generator.early</code></td><td>生成的高优先级单元(系统与全局用户共用)(参见 <a href="systemd.generator.html#"><span class="citerefentry"><span class="refentrytitle">systemd.generator</span>(7)</span></a> 手册中对 <em class="replaceable"><code>early-dir</code></em> 的说明)</td></tr><tr><td><code class="filename">$XDG_CONFIG_HOME/systemd/user</code> 或 <code class="filename">$HOME/.config/systemd/user</code></td><td>用户配置的私有用户单元(仅在未设置 <code class="varname">$XDG_CONFIG_HOME</code> 时才使用 <code class="filename">~/.config</code> 来替代)</td></tr><tr><td><code class="filename">/etc/systemd/user</code></td><td>本地配置的全局用户单元</td></tr><tr><td><code class="filename">$XDG_RUNTIME_DIR/systemd/user</code></td><td>运行时配置的私有用户单元(仅当 $XDG_RUNTIME_DIR 已被设置时有效)</td></tr><tr><td><code class="filename">/run/systemd/user</code></td><td>运行时配置的全局用户单元</td></tr><tr><td><code class="filename">$XDG_RUNTIME_DIR/systemd/generator</code></td><td>生成的中优先级私有用户单元(参见 <a href="systemd.generator.html#"><span class="citerefentry"><span class="refentrytitle">systemd.generator</span>(7)</span></a> 手册中对 <em class="replaceable"><code>normal-dir</code></em> 的说明)</td></tr><tr><td><code class="filename">$XDG_DATA_HOME/systemd/user</code> 或 <code class="filename">$HOME/.local/share/systemd/user</code></td><td>软件包安装在用户家目录中的私有用户单元(仅在未设置 <code class="varname">$XDG_DATA_HOME</code> 时才使用 <code class="filename">~/.local/share</code> 来替代)</td></tr><tr><td><code class="filename">$dir/systemd/user</code>(对应 <code class="varname">$XDG_DATA_DIRS</code> 中的每一个目录(<code class="varname">$dir</code>))</td><td>额外安装的全局用户单元，对应 <code class="varname">$XDG_DATA_DIRS</code>(默认值="/usr/local/share/:/usr/share/") 中的每一个目录。</td></tr><tr><td><code class="filename">/usr/local/lib/systemd/user</code></td><td>本地软件包安装的全局用户单元</td></tr><tr><td><code class="filename">/usr/lib/systemd/user</code></td><td>发行版软件包安装的全局用户单元</td></tr><tr><td><code class="filename">$XDG_RUNTIME_DIR/systemd/generator.late</code></td><td>生成的低优先级私有用户单元(参见 <a href="systemd.generator.html#"><span class="citerefentry"><span class="refentrytitle">systemd.generator</span>(7)</span></a> 手册中对 <em class="replaceable"><code>late-dir</code></em> 的说明)</td></tr></tbody></table></div></div><br class="table-break"><p>可以使用环境变量来
    扩充或更改 systemd 用户实例(<code class="option">--user</code>)的单元文件加载路径。
    环境变量可以通过环境变量生成器(详见
    <a href="systemd.environment-generator.html#"><span class="citerefentry"><span class="refentrytitle">systemd.environment-generator</span>(7)</span></a>
    手册)来设置。特别地， <code class="varname">$XDG_DATA_HOME</code> 与
    <code class="varname">$XDG_DATA_DIRS</code> 可以方便的通过
    <a href="systemd-environment-d-generator.html#"><span class="citerefentry"><span class="refentrytitle">systemd-environment-d-generator</span>(8)</span></a>
    来设置。这样，上表中列出的单元目录正好就是默认值。
    要查看实际使用的、基于编译选项与当前环境变量的单元目录列表，可以使用
    </p><pre class="programlisting">systemd-analyze --user unit-paths</pre><p>
    </p><p>此外，还可以通过
    <a href="systemctl.html#"><span class="citerefentry"><span class="refentrytitle">systemctl</span>(1)</span></a>
    的 <span class="command"><strong>link</strong></span> 命令
    向上述单元目录中添加额外的单元(不在上述常规单元目录中的单元)。
    </p></div><div class="refsect1"><a name="id-1.9"></a><h2 id="单元垃圾回收">单元垃圾回收<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%E5%8D%95%E5%85%83%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6">¶</a></h2><p> systemd 会在首次引用一个单元时自动加载该单元的配置，
    并在不再需要该单元时自动卸载该单元的配置与状态(垃圾回收)。
    可以通过多种不同机制引用单元：</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>该单元是另外一个已加载单元的依赖，例如 <code class="varname">After=</code>,
      <code class="varname">Wants=</code>, …</p></li><li class="listitem"><p>该单元正在启动(starting)、运行(running)、重新加载配置(reloading)、停止(stopping)</p></li><li class="listitem"><p>该单元正处于失败(<code class="constant">failed</code>)状态(详见下文)</p></li><li class="listitem"><p>该单元的一个任务正在排队等候执行</p></li><li class="listitem"><p>该单元正在被一个活动的IPC客户端程序锁定</p></li><li class="listitem"><p>该单元是一个特殊的"永久"单元，总是被加载并启动。
      例如，根文件系统挂载点 <code class="filename">-.mount</code> 单元、以及 systemd(PID=1) 自身所在的 <code class="filename">init.scope</code> 
      单元。</p></li><li class="listitem"><p>该单元拥有与其关联的、正在运行中的进程</p></li></ol></div><p>可以使用 <code class="varname">CollectMode=</code> 选项设置垃圾回收策略，
    也就是，是否允许自动卸载处于失败(<code class="constant">failed</code>)状态的单元
    (详见下文)。</p><p>当一个单元的配置与状态被卸载之后，该单元的所有执行结果，除了已经记录在日志中的信息之外，所有其他信息，
    例如，退出码、退出信号、资源占用，等等，都会消失。</p><p>即使单元的配置已经加载，也可以使用 <span class="command"><strong>systemctl daemon-reload</strong></span> 或其他等效命令，强制重新加载单元配置。
    所有已经加载的配置都将被清空，
    并被新加载的配置取代(当然，新配置未必就立即生效)，
    同时所有运行时状态都会被保存并恢复。</p></div><div class="refsect1"><a name="id-1.10"></a><h2 id="[Unit] 小节选项">[Unit] 小节选项<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%5BUnit%5D%20%E5%B0%8F%E8%8A%82%E9%80%89%E9%A1%B9">¶</a></h2><p>单元文件中的 [Unit] 小节
    包含与单元类型无关的通用信息。
    可用的选项(亦称"指令"或"属性")如下：</p><div class="variablelist"><dl class="variablelist"><dt id="Description="><span class="term"><code class="varname">Description=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#Description=">¶</a></dt><dd><p>有利于人类阅读的、对单元进行简单描述的字符串。将被
        <span class="command"><strong>systemd</strong></span> 或其他程序用来标记此单元，
        这个字符串应该只用于识别此单元即可，不需要过分说明。例如 "<code class="literal">Apache2 Web
        Server</code>" 就是一个好例子，而 "<code class="literal">high-performance light-weight
        HTTP server</code>" (太通用) 与 "<code class="literal">Apache2</code>" (信息太少)
        则是两个坏例子。因为 <span class="command"><strong>systemd</strong></span>
        将会把这个字符串用于状态信息中("<code class="literal">Starting
        <em class="replaceable"><code>description</code></em>...</code>", "<code class="literal">Started
        <em class="replaceable"><code>description</code></em>.</code>", "<code class="literal">Reached target
        <em class="replaceable"><code>description</code></em>.</code>", "<code class="literal">Failed to start
        <em class="replaceable"><code>description</code></em>.</code>")，所以这个字符串应该表现的像一个名词，
        而不是一个完整的句子或带有动词的短语。比如
        "<code class="literal">exiting the container</code>" 或 "<code class="literal">updating the database once per
        day.</code>" 就是典型的坏例子。</p></dd><dt id="Documentation="><span class="term"><code class="varname">Documentation=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#Documentation=">¶</a></dt><dd><p>一组用空格分隔的文档URI列表，
        这些文档是对此单元的详细说明。
        可接受 "<code class="literal">http://</code>",
        "<code class="literal">https://</code>", "<code class="literal">file:</code>",
        "<code class="literal">info:</code>", "<code class="literal">man:</code>" 五种URI类型。
        有关URI语法的详细说明，参见 <a href="http://man7.org/linux/man-pages/man7/uri.7.html"><span class="citerefentry"><span class="refentrytitle">uri</span>(7)</span></a> 手册。
        这些URI应该按照相关性由高到低列出。
        比如，将解释该单元作用的文档放在第一个，
        最好再紧跟单元的配置说明，
        最后再附上其他文档。
        可以多次使用此选项，
        依次向文档列表尾部添加新文档。
        但是，如果为此选项设置一个空字符串，
        那么表示
        清空先前已存在的列表。</p></dd><dt id="Requires="><span class="term"><code class="varname">Requires=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#Requires=">¶</a></dt><dd><p>设置此单元所必须依赖的其他单元。当启动此单元时，也必须启动这里列出的所有其他单元。
        如果此处列出的某个单元启动失败、并且恰好又设置了到这个失败单元的
        <code class="varname">After=</code> 依赖，那么将不会启动此单元。此外，无论是否设置了到被依赖单元的
         <code class="varname">After=</code> 依赖，只要某个被依赖的单元被显式停止，那么该单元也会被连带停止。
        想要添加多个单元，可以多次使用此选项，也可以设置一个空格分隔的单元列表。
        注意，此选项并不影响单元之间的启动或停止顺序。
        要想调整单元之间的启动或停止顺序，请使用
        <code class="varname">After=</code> 或 <code class="varname">Before=</code> 选项。
        例如，在 <code class="filename">foo.service</code> 中设置了 <code class="varname">Requires=bar.service</code> ，
        但是并未使用 <code class="varname">After=</code> 或 <code class="varname">Before=</code> 设定两者的启动顺序，
        那么，当需要启动 <code class="filename">foo.service</code> 的时候，这两个单元会被并行的同时启动。
        建议使用 <code class="varname">Wants=</code> 代替 <code class="varname">Requires=</code> 来设置单元之间的非致命依赖关系，
        从而有助于获得更好的健壮性，
        特别是在某些单元启动失败的时候。</p><p>注意，设置了此依赖并不意味着当本单元处于运行状态时，被依赖的其他单元也必须总是处于运行状态。
        例如：(1)失败的条件检查(例如后文的 <code class="varname">ConditionPathExists=</code>,
        <code class="varname">ConditionPathIsSymbolicLink=</code>, …)只会导致被依赖的单元跳过启动，而不会导致被依赖的单元启动失败(也就是进入"failed"状态)。
        (2)某些被依赖的单元可能会自己主动停止(例如有的服务进程可能会主动干净的退出、有的设备可能被用户拔出)，
        而不会导致本单元自身也跟着一起停止。
        要想达到这样的效果，可以同时联合使用 <code class="varname">BindsTo=</code>
        与 <code class="varname">After=</code> 依赖，这样就可以确保：在被依赖的其他单元没有处于运行状态时，
        本单元自身永远不会启动成功(详见后文)。</p><p>注意，
        此种依赖关系也可以在单元文件之外通过向 <code class="filename">.requires/</code>目录中添加软连接来设置。
        详见前文。</p></dd><dt id="Requisite="><span class="term"><code class="varname">Requisite=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#Requisite=">¶</a></dt><dd><p>与 <code class="varname">Requires=</code> 类似。不同之处在于：当此单元启动时，这里列出的依赖单元必须已经全部处于启动成功的状态，
        否则，此单元将会立即进入启动失败的状态，并且也不会启动那些尚未成功启动的被依赖单元。
        因为 <code class="varname">Requisite=</code> 不隐含任何顺序依赖(即使两个单元在同一个事务中启动)，
        所以，此选项经常与
         <code class="varname">After=</code> 一起使用，
        以确保此单元不会在启动时间上早于被依赖的单元。</p><p>如果 <code class="filename">a.service</code> 中包含了
        <code class="varname">Requisite=b.service</code> ，那么这个依赖关系将在
        <code class="filename">b.service</code> 的属性列表中显示为 <code class="varname">RequisiteOf=a.service</code> 。
        也就是说，不能直接设置 <code class="varname">RequisiteOf=</code>
        依赖。</p></dd><dt id="Wants="><span class="term"><code class="varname">Wants=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#Wants=">¶</a></dt><dd><p>此选项是 
        <code class="varname">Requires=</code> 的弱化版。
        当此单元被启动时，
        所有这里列出的其他单元只是尽可能被启动。
        但是，即使某些单元不存在或者未能启动成功，
        也不会影响此单元的启动。
        推荐使用此选项来设置单元之间的依赖关系。</p><p>注意，
        此种依赖关系也可以在单元文件之外通过向
        <code class="filename">.wants/</code>
        目录中添加软连接来设置，
        详见前文。</p></dd><dt id="BindsTo="><span class="term"><code class="varname">BindsTo=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#BindsTo=">¶</a></dt><dd><p>与 
        <code class="varname">Requires=</code> 类似，但是依赖性更强：
        如果这里列出的任意一个单元停止运行或者崩溃，那么也会连带导致该单元自身被停止。
        这就意味着该单元可能因为
        这里列出的任意一个单元的
        主动退出、某个设备被拔出、某个挂载点被卸载，
        而被强行停止。</p><p>如果将某个被依赖的单元同时放到 <code class="varname">After=</code> 与
        <code class="varname">BindsTo=</code> 选项中，那么效果将会更加强烈：被依赖的单元必须严格的先于本单元启动成功之后，
        本单元才能开始启动。这就意味着，不但在被依赖的单元意外停止时，该单元必须停止，
        而且在被依赖的单元由于条件检查失败(例如后文的
        <code class="varname">ConditionPathExists=</code>, <code class="varname">ConditionPathIsSymbolicLink=</code>, …)而被跳过时，
        该单元也将无法启动。正因为如此，在很多场景下，需要同时使用
        <code class="varname">BindsTo=</code> 与 <code class="varname">After=</code> 选项。</p><p>如果 <code class="filename">a.service</code> 中包含了
         <code class="varname">BindsTo=b.service</code> ，那么这个依赖关系将在
        <code class="filename">b.service</code> 的属性列表中显示为 <code class="varname">BoundBy=a.service</code> 。
        也就是说，不能直接设置 <code class="varname">BoundBy=</code>
        依赖。</p></dd><dt id="PartOf="><span class="term"><code class="varname">PartOf=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#PartOf=">¶</a></dt><dd><p>与 <code class="varname">Requires=</code> 类似，
        不同之处在于：仅作用于单元的停止或重启。
        其含义是，当停止或重启这里列出的某个单元时，
        也会同时停止或重启该单元自身。
        注意，这个依赖是单向的，
        该单元自身的停止或重启并不影响这里列出的单元。</p><p>如果 <code class="filename">a.service</code> 中包含了
        <code class="varname">PartOf=b.service</code> ，那么这个依赖关系将在
        <code class="filename">b.service</code> 的属性列表中显示为 <code class="varname">ConsistsOf=a.service</code> 。
        也就是说，不能直接设置 <code class="varname">ConsistsOf=</code>
        依赖。</p></dd><dt id="Conflicts="><span class="term"><code class="varname">Conflicts=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#Conflicts=">¶</a></dt><dd><p>指定单元之间的冲突关系。
        接受一个空格分隔的单元列表，表明该单元不能与列表中的任何单元共存，
        也就是说：(1)当此单元启动的时候，列表中的所有单元都将被停止；
        (2)当列表中的某个单元启动的时候，该单元同样也将被停止。
        注意，此选项与
        <code class="varname">After=</code> 和 <code class="varname">Before=</code>
        选项没有任何关系。</p><p>如果两个相互冲突的单元A与B
        需要在同一个事务内作为B启动，
        那么这个事务要么会失败(A与B都是事务中的必要部分[Requires])，
        要么就是必须被修改(A与B中至少有一个是事务中的非必要部分)。
        在后一种情况下，
        将会剔除一个非必要的单元
        (若两个都是非必要的单元，
        则优先剔除A)。</p></dd><dt id="Before="><span class="term"><code class="varname">Before=</code>, </span><span class="term"><code class="varname">After=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#Before=">¶</a></dt><dd><p>强制指定单元之间的先后顺序，接受一个空格分隔的单元列表。
        假定 <code class="filename">foo.service</code> 单元包含 <code class="option">Before=bar.service</code> 设置，
        那么当两个单元都需要启动的时候，
         <code class="filename">bar.service</code> 将会一直延迟到 <code class="filename">foo.service</code> 启动完毕之后再启动。
        注意，停止顺序与启动顺序正好相反，也就是说，
        只有当 <code class="filename">bar.service</code> 完全停止后，才会停止 <code class="filename">foo.service</code> 单元。
        <code class="varname">After=</code> 的含义与 <code class="varname">Before=</code> 正好相反。
        假定 <code class="filename">foo.service</code> 单元包含 <code class="option">After=bar.service</code> 设置，
        那么当两个单元都需要启动的时候，
         <code class="filename">foo.service</code> 将会一直延迟到 <code class="filename">bar.service</code> 启动完毕之后再启动。
        注意，停止顺序与启动顺序正好相反，也就是说，
        只有当 <code class="filename">foo.service</code> 完全停止后，才会停止 <code class="filename">bar.service</code> 单元。
        注意，此二选项仅用于指定先后顺序，
        而与 <code class="varname">Requires=</code>, <code class="varname">Wants=</code>, <code class="varname">BindsTo=</code> 这些选项没有任何关系。
        不过在实践中也经常遇见将某个单元同时设置到 <code class="varname">After=</code> 与 <code class="varname">Requires=</code> 选项中的情形。
        可以多次使用此二选项，以将多个单元添加到列表中。
        假定两个单元之间存在先后顺序(无论谁先谁后)，并且一个要停止而另一个要启动，那么永远是"先停止后启动"的顺序。
        但如果两个单元之间没有先后顺序，那么它们的停止和启动就都是相互独立的，并且是并行的。
        对于不同类型的单元来说，判断启动是否已经完成的标准并不完全相同。
        特别的，对于设置在 <code class="varname">Before=</code>/<code class="varname">After=</code> 中的服务单元来说，
        只有在服务单元内配置的所有启动命令全部都已经被调用，并且对于每一个被调用的命令，
        要么确认已经调用失败、要么确认已经成功运行的情况下，
        才能认为已经完成启动。</p></dd><dt id="OnFailure="><span class="term"><code class="varname">OnFailure=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#OnFailure=">¶</a></dt><dd><p>接受一个空格分隔的单元列表。
        当该单元进入失败("<code class="literal">failed</code>")状态时，
        将会启动列表中的单元。使用了
        <code class="varname">Restart=</code> 的服务单元仅在超出启动频率限制之后，
        才会进入失败(failed)状态。</p></dd><dt id="PropagatesReloadTo="><span class="term"><code class="varname">PropagatesReloadTo=</code>, </span><span class="term"><code class="varname">ReloadPropagatedFrom=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#PropagatesReloadTo=">¶</a></dt><dd><p>接受一个空格分隔的单元列表。
        <code class="varname">PropagatesReloadTo=</code> 表示
        在 reload 该单元时，
        也同时 reload 所有列表中的单元。
        <code class="varname">ReloadPropagatedFrom=</code> 表示
        在 reload 列表中的某个单元时，
        也同时 reload 该单元。</p></dd><dt id="JoinsNamespaceOf="><span class="term"><code class="varname">JoinsNamespaceOf=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#JoinsNamespaceOf=">¶</a></dt><dd><p>接受一个空格分隔的单元列表，
        表示将该单元所启动的进程加入到列表单元的网络及
        临时文件(<code class="filename">/tmp</code>, <code class="filename">/var/tmp</code>)的名字空间中。
        此选项仅适用于支持
        <code class="varname">PrivateNetwork=</code> 与/或
        <code class="varname">PrivateTmp=</code> 指令的单元(对加入者与被加入者都适用)。详见
        <a href="systemd.exec.html#"><span class="citerefentry"><span class="refentrytitle">systemd.exec</span>(5)</span></a>
        手册。
        如果单元列表中
        仅有一个单元处于已启动状态，
        那么该单元将加入到
        这个唯一已启动单元的名字空间中。
        如果单元列表中
        有多个单元处于已启动状态，
        那么该单元将
        随机加入一个已启动单元的
        名字空间中。</p></dd><dt id="RequiresMountsFor="><span class="term"><code class="varname">RequiresMountsFor=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#RequiresMountsFor=">¶</a></dt><dd><p>接受一个空格分隔的绝对路径列表，表示该单元将会使用到这些文件系统路径。
        所有这些路径中涉及的挂载点所对应的 mount 单元，都会被隐式的添加到
        <code class="varname">Requires=</code> 与 <code class="varname">After=</code> 选项中。
        也就是说，这些路径中所涉及的挂载点都会在启动该单元之前被自动挂载。</p><p>注意，虽然带有 <code class="option">noauto</code> 标记的挂载点不会被 <code class="filename">local-fs.target</code> 自动挂载，
        但是它并不影响此选项所设置的依赖关系。
        也就是说，带有 <code class="option">noauto</code> 标记的挂载点
        依然会在启动该单元之前被自动挂载。</p></dd><dt id="OnFailureJobMode="><span class="term"><code class="varname">OnFailureJobMode=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#OnFailureJobMode=">¶</a></dt><dd><p>可设为
        "<code class="literal">fail</code>",
        "<code class="literal">replace</code>",
        "<code class="literal">replace-irreversibly</code>",
        "<code class="literal">isolate</code>",
        "<code class="literal">flush</code>",
        "<code class="literal">ignore-dependencies</code>",
        "<code class="literal">ignore-requirements</code>" 之一。
        默认值是 "<code class="literal">replace</code>" 。
        指定 <code class="varname">OnFailure=</code> 中列出的单元应该以何种方式排队。值的含义参见
        <a href="systemctl.html#"><span class="citerefentry"><span class="refentrytitle">systemctl</span>(1)</span></a>
        手册中对 <code class="option">--job-mode=</code> 选项的说明。
        如果设为 "<code class="literal">isolate</code>" ，
        那么只能在
        <code class="varname">OnFailure=</code> 中设置一个单独的单元。</p></dd><dt id="IgnoreOnIsolate="><span class="term"><code class="varname">IgnoreOnIsolate=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#IgnoreOnIsolate=">¶</a></dt><dd><p>接受一个布尔值。设为 <code class="option">yes</code> 表示在执行
         <span class="command"><strong>systemctl isolate ...</strong></span> 命令时，此单元不会被停止。
        对于 service, target, socket, timer, path 单元来说，默认值是 <code class="option">false</code> ；
        对于 slice, scope, device, swap, mount, automount 单元来说，
        默认值是 <code class="option">true</code> 。</p></dd><dt id="StopWhenUnneeded="><span class="term"><code class="varname">StopWhenUnneeded=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#StopWhenUnneeded=">¶</a></dt><dd><p>如果设为
        <code class="option">yes</code> ，
        那么当此单元不再被任何已启动的单元依赖时，
        将会被自动停止。
        默认值 <code class="option">no</code> 的含义是，
        除非此单元与其他即将启动的单元冲突，
        否则即使此单元已不再被任何已启动的单元依赖，
        也不会自动停止它。</p></dd><dt id="RefuseManualStart="><span class="term"><code class="varname">RefuseManualStart=</code>, </span><span class="term"><code class="varname">RefuseManualStop=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#RefuseManualStart=">¶</a></dt><dd><p>如果设为
        <code class="option">yes</code> ，
        那么此单元将拒绝被手动启动(<code class="varname">RefuseManualStart=</code>)
        或拒绝被手动停止(<code class="varname">RefuseManualStop=</code>)。
        也就是说，
        此单元只能作为其他单元的依赖条件而存在，
        只能因为依赖关系而被间接启动或者间接停止，
        不能由用户以手动方式直接启动或者直接停止。
        设置此选项是为了
        禁止用户意外的启动或者停止某些特定的单元。
        默认值是 <code class="option">no</code></p></dd><dt id="AllowIsolate="><span class="term"><code class="varname">AllowIsolate=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#AllowIsolate=">¶</a></dt><dd><p>如果设为
        <code class="option">yes</code> ，
        那么此单元将允许被 <span class="command"><strong>systemctl isolate</strong></span> 命令操作，
        否则将会被拒绝。
        唯一一个将此选项设为 <code class="option">yes</code> 的理由，大概是为了兼容SysV初始化系统。
        此时应该仅考虑对 target 单元进行设置，
        以防止系统进入不可用状态。
        建议保持默认值 <code class="option">no</code></p></dd><dt id="DefaultDependencies="><span class="term"><code class="varname">DefaultDependencies=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#DefaultDependencies=">¶</a></dt><dd><p>默认值
        <code class="option">yes</code> 表示为此单元隐式地创建默认依赖。
        不同类型的单元，其默认依赖也不同，详见各自的手册页。
        例如对于 service 单元来说，
        默认的依赖关系是指：
        (1)开机时，必须在基础系统初始化完成之后才能启动该服务；
        (2)关机时，必须在该服务完全停止后才能关闭基础系统。
        通常，只有那些在系统启动的早期就必须启动的单元，
        以及那些必须在系统关闭的末尾才能关闭的单元，
        才可以将此选项设为 <code class="option">no</code> 。
        注意，设为 <code class="option">no</code> 并不表示取消所有的默认依赖，
        只是表示取消非关键的默认依赖。
        强烈建议对绝大多数普通单元
        保持此选项的默认值 <code class="option">yes</code> 。</p></dd><dt id="CollectMode="><span class="term"><code class="varname">CollectMode=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#CollectMode=">¶</a></dt><dd><p>设置此单元的"垃圾回收"策略。可设为 <code class="option">inactive</code>(默认值)
        或 <code class="option">inactive-or-failed</code> 之一。默认值 <code class="option">inactive</code>
        表示如果该单元处于停止(<code class="constant">inactive</code>)状态，并且没有被其他客户端、任务、单元所引用，那么该单元将会被卸载。
        注意，如果此单元处于失败(<code class="constant">failed</code>)状态，那么是不会被卸载的，
        它会一直保持未卸载状态，直到用户调用 <span class="command"><strong>systemctl reset-failed</strong></span> (或类似的命令)重置了
        <code class="constant">failed</code> 状态。设为 <code class="option">inactive-or-failed</code>
        表示无论此单元处于停止(<code class="constant">inactive</code>)状态还是失败(<code class="constant">failed</code>)状态，
        都将被卸载(无需重置 <code class="constant">failed</code> 状态)。
        注意，在这种"垃圾回收"策略下，
        此单元的所有结果(退出码、退出信号、资源消耗 …)
        都会在此单元结束之后立即清除(只剩下此前已经记录在日志中的痕迹)。</p></dd><dt id="FailureAction="><span class="term"><code class="varname">FailureAction=</code>, </span><span class="term"><code class="varname">SuccessAction=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#FailureAction=">¶</a></dt><dd><p>当此单元停止并进入失败(<code class="constant">failed</code>)或停止(<code class="constant">inactive</code>)状态时，应当执行什么动作。
        对于系统单元，可以设为 <code class="option">none</code>, <code class="option">reboot</code>, <code class="option">reboot-force</code>,
        <code class="option">reboot-immediate</code>, <code class="option">poweroff</code>, <code class="option">poweroff-force</code>,
        <code class="option">poweroff-immediate</code>, <code class="option">exit</code>, <code class="option">exit-force</code> 之一。
        对于用户单元，仅可设为 <code class="option">none</code>, <code class="option">exit</code>,
        <code class="option">exit-force</code> 之一。两个选项的默认值都是 <code class="option">none</code></p><p>默认值 <code class="option">none</code> 表示
        不触发任何动作。
        <code class="option">reboot</code>/<code class="option">poweroff</code> 表示按照常规关机流程重启/关闭整个系统(等价于 <span class="command"><strong>systemctl reboot|poweroff</strong></span>)。
        <code class="option">reboot-force</code>/<code class="option">poweroff-force</code> 表示强制杀死所有进程之后强制重启/关机，
        虽然可能会造成应用程序数据丢失，但是不会造成文件系统不一致(等价于 <span class="command"><strong>systemctl reboot|poweroff -f</strong></span>)。
        <code class="option">reboot-immediate</code>/<code class="option">poweroff-immediate</code> 表示强制立即执行
        <a href="http://man7.org/linux/man-pages/man2/reboot.2.html"><span class="citerefentry"><span class="refentrytitle">reboot</span>(2)</span></a> 系统调用重启/关机，
        可能会造成数据丢失以及文件系统不一致(等价于 <span class="command"><strong>systemctl reboot|poweroff -ff</strong></span>)。
        <code class="option">exit</code> 表示按照常规关闭流程，按部就班的退出 systemd 系统管理器。
        <code class="option">exit-force</code> 表示立即强制退出 systemd 系统管理器(不再按部就班的逐一退出全部服务)。
        当设为 <code class="option">exit</code> 或 <code class="option">exit-force</code> 时，
        systemd 系统管理器将会默认把此单元主进程的返回值(如果有)用作系统管理器自身的返回值。
        当然，这个默认行为可以通过下面的 <code class="varname">FailureActionExitStatus=</code>/<code class="varname">SuccessActionExitStatus=</code>
        进行修改。</p></dd><dt id="FailureActionExitStatus="><span class="term"><code class="varname">FailureActionExitStatus=</code>, </span><span class="term"><code class="varname">SuccessActionExitStatus=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#FailureActionExitStatus=">¶</a></dt><dd><p>当 <code class="varname">FailureAction=</code>/<code class="varname">SuccessAction=</code> 的值为 <code class="option">exit</code> 或
        <code class="option">exit-force</code> 之一，并且设定的动作被触发时，应该返回什么样退出码给容器管理器(对于系统服务)
        或 systemd 系统管理器(对于用户服务)。
        默认情况下，将会使用该单元主进程的退出码(如果有)。
        取值范围是 0…255 之间的一个整数。
        设为空字符串表示重置回默认行为。</p></dd><dt id="JobTimeoutSec="><span class="term"><code class="varname">JobTimeoutSec=</code>, </span><span class="term"><code class="varname">JobRunningTimeoutSec=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#JobTimeoutSec=">¶</a></dt><dd><p>当该单元的一个任务(job)进入队列的时候，
         <code class="varname">JobTimeoutSec=</code> 用于设置从该任务进入队列开始计时、到该任务最终完成，最多可以使用多长时间，
         <code class="varname">JobRunningTimeoutSec=</code> 用于设置从该任务实际运行开始计时、到该任务最终完成，最多可以使用多长时间。
        如果上述任意一个设置超时，那么超时的任务将被撤销，并且该单元将保持其现有状态不变(而不是进入 "<code class="literal">failed</code>" 状态)。
        对于非 device 单元来说，<code class="varname">DefaultTimeoutStartSec=</code> 选项的默认值是 "<code class="literal">infinity</code>"(永不超时)，
        而 <code class="varname">JobRunningTimeoutSec=</code> 的默认值等于 <code class="varname">DefaultTimeoutStartSec=</code> 的值。
        注意，此处设置的超时不是指单元自身的超时(例如 <code class="varname">TimeoutStartSec=</code> 就是指单元自身的超时)，
        而是指该单元在启动或者停止等状态变化过程中，等候某个外部任务完成的最长时限。
        换句话说，适用于单元自身的超时设置(例如 <code class="varname">TimeoutStartSec=</code>)用于指定单元自身在改变其状态时，总共允许使用多长时间；
        而此处设置的超时则是设置此单元在改变其状态的过程中，等候某个外部任务完成所能容忍的最长时间。</p></dd><dt id="JobTimeoutAction="><span class="term"><code class="varname">JobTimeoutAction=</code>, </span><span class="term"><code class="varname">JobTimeoutRebootArgument=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#JobTimeoutAction=">¶</a></dt><dd><p><code class="varname">JobTimeoutAction=</code> 用于指定当超时发生时(参见上文的
         <code class="varname">JobTimeoutSec=</code> 与 <code class="varname">JobRunningTimeoutSec=</code> 选项)，将触发什么样的额外动作。
        可接受的值与
        <code class="varname">StartLimitAction=</code> 相同，默认值为 <code class="option">none</code> 。
        <code class="varname">JobTimeoutRebootArgument=</code> 用于指定传递给
        <a href="http://man7.org/linux/man-pages/man2/reboot.2.html"><span class="citerefentry"><span class="refentrytitle">reboot</span>(2)</span></a> 系统调用的字符串参数。
        </p></dd><dt id="StartLimitIntervalSec=interval"><span class="term"><code class="varname">StartLimitIntervalSec=<em class="replaceable"><code>interval</code></em></code>, </span><span class="term"><code class="varname">StartLimitBurst=<em class="replaceable"><code>burst</code></em></code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#StartLimitIntervalSec=interval">¶</a></dt><dd><p>设置单元的启动频率限制。
        也就是该单元在 <em class="replaceable"><code>interval</code></em> 时间内最多允许启动 <em class="replaceable"><code>burst</code></em> 次。
        <code class="varname">StartLimitIntervalSec=</code> 用于设置时长(默认值等于
         systemd 配置文件(system.conf)中 <code class="varname">DefaultStartLimitIntervalSec=</code> 的值)，设为 0 表示没有限制。
         <code class="varname">StartLimitBurst=</code> 用于设置在给定的时长内，最多允许启动多少次(默认值等于
         systemd 配置文件(system.conf)中 <code class="varname">DefaultStartLimitBurst=</code> 的值)。
        虽然此选项通常与
        <code class="varname">Restart=</code> 选项(参见
        <a href="systemd.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd.service</span>(5)</span></a>) 一起使用，
        但实际上，此选项作用于任何方式的启动(包括手动启动)，而不仅仅是由 <code class="varname">Restart=</code> 触发的启动。
        注意，一旦某个设置了 <code class="varname">Restart=</code> 自动重启逻辑的单元触碰到了启动频率限制，
        那么该单元将再也不会尝试自动重启；
        不过，如果该单元在经过 <em class="replaceable"><code>interval</code></em> 时长之后，又被手动重启成功的话，那么该单元的自动重启逻辑将会被再次激活。
        注意，<span class="command"><strong>systemctl reset-failed</strong></span> 命令能够重置单元的启动频率计数器。
        系统管理员在手动启动某个已经触碰到了启动频率限制的单元之前，可以使用这个命令清除启动限制。
        注意，因为启动频率限制位于所有单元条件检查之后，
        所以基于失败条件的启动不会计入启动频率限制的启动次数之中。
        注意，这些选项对 slice, target, device, scope 单元没有意义，
        因为这几种单元要么永远不会启动失败、要么只能成功启动一次。</p><p>当一个单元因为垃圾回收(见前文)而被卸载的时候，
        该单元的启动频率计数器也会被一起清除。
        这就意味着对不被持续引用的单元设置启动频率限制是无效的。</p></dd><dt id="StartLimitAction="><span class="term"><code class="varname">StartLimitAction=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#StartLimitAction=">¶</a></dt><dd><p>设置该单元在触碰了
        <code class="varname">StartLimitIntervalSec=</code> 与 <code class="varname">StartLimitBurst=</code> 定义的启动频率限制时，将会执行什么动作。
        可接受的值与 <code class="varname">FailureAction=</code>/<code class="varname">SuccessAction=</code> 相同，值的含义也相同。
        默认值 <code class="option">none</code> 表示除了禁止启动之外，
        不触发任何其他动作。</p></dd><dt id="RebootArgument="><span class="term"><code class="varname">RebootArgument=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#RebootArgument=">¶</a></dt><dd><p>当 <code class="varname">StartLimitAction=</code> 或 <code class="varname">FailureAction=</code> 触发重启动作时，
        此选项的值就是传递给
        <a href="http://man7.org/linux/man-pages/man2/reboot.2.html"><span class="citerefentry"><span class="refentrytitle">reboot</span>(2)</span></a> 系统调用的字符串参数。
        相当于 <span class="command"><strong>systemctl reboot</strong></span> 命令接收的可选参数。</p></dd><dt id="ConditionArchitecture="><span class="term"><code class="varname">ConditionArchitecture=</code>, </span><span class="term"><code class="varname">ConditionVirtualization=</code>, </span><span class="term"><code class="varname">ConditionHost=</code>, </span><span class="term"><code class="varname">ConditionKernelCommandLine=</code>, </span><span class="term"><code class="varname">ConditionKernelVersion=</code>, </span><span class="term"><code class="varname">ConditionSecurity=</code>, </span><span class="term"><code class="varname">ConditionCapability=</code>, </span><span class="term"><code class="varname">ConditionACPower=</code>, </span><span class="term"><code class="varname">ConditionNeedsUpdate=</code>, </span><span class="term"><code class="varname">ConditionFirstBoot=</code>, </span><span class="term"><code class="varname">ConditionPathExists=</code>, </span><span class="term"><code class="varname">ConditionPathExistsGlob=</code>, </span><span class="term"><code class="varname">ConditionPathIsDirectory=</code>, </span><span class="term"><code class="varname">ConditionPathIsSymbolicLink=</code>, </span><span class="term"><code class="varname">ConditionPathIsMountPoint=</code>, </span><span class="term"><code class="varname">ConditionPathIsReadWrite=</code>, </span><span class="term"><code class="varname">ConditionDirectoryNotEmpty=</code>, </span><span class="term"><code class="varname">ConditionFileNotEmpty=</code>, </span><span class="term"><code class="varname">ConditionFileIsExecutable=</code>, </span><span class="term"><code class="varname">ConditionUser=</code>, </span><span class="term"><code class="varname">ConditionGroup=</code>, </span><span class="term"><code class="varname">ConditionControlGroupController=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#ConditionArchitecture=">¶</a></dt><dd><p>这组选项用于在启动单元之前，首先测试特定的条件是否为真。
        若为假，则悄无声息地跳过此单元的启动(仅是跳过，而不是进入"<code class="literal">failed</code>"状态)。
        注意，即使某单元由于测试条件为假而被跳过，
        那些由于依赖关系而必须先于此单元启动的单元并不会受到影响(也就是会照常启动)。
        可以使用条件表达式来跳过那些对于本机系统无用的单元，
        比如那些对于本机内核或运行环境没有用处的功能。
        如果想要单元在测试条件为假时，
        除了跳过启动之外，还要在日志中留下痕迹(而不是悄无声息的跳过)，
        可以使用对应的另一组 <code class="varname">AssertArchitecture=</code>, <code class="varname">AssertVirtualization=</code>, … 选项(见后文)。</p><p><code class="varname">ConditionArchitecture=</code>
        检测是否运行于
        特定的硬件平台：
        <code class="varname">x86</code>,
        <code class="varname">x86-64</code>,
        <code class="varname">ppc</code>,
        <code class="varname">ppc-le</code>,
        <code class="varname">ppc64</code>,
        <code class="varname">ppc64-le</code>,
        <code class="varname">ia64</code>,
        <code class="varname">parisc</code>,
        <code class="varname">parisc64</code>,
        <code class="varname">s390</code>,
        <code class="varname">s390x</code>,
        <code class="varname">sparc</code>,
        <code class="varname">sparc64</code>,
        <code class="varname">mips</code>,
        <code class="varname">mips-le</code>,
        <code class="varname">mips64</code>,
        <code class="varname">mips64-le</code>,
        <code class="varname">alpha</code>,
        <code class="varname">arm</code>,
        <code class="varname">arm-be</code>,
        <code class="varname">arm64</code>,
        <code class="varname">arm64-be</code>,
        <code class="varname">sh</code>,
        <code class="varname">sh64</code>,
        <code class="varname">m68k</code>,
        <code class="varname">tilegx</code>,
        <code class="varname">cris</code>,
        <code class="varname">arc</code>,
        <code class="varname">arc-be</code>,
        <code class="varname">native</code>(编译
         systemd 
        时的目标平台)。
        可以在这些关键字前面加上感叹号(!)前缀
        表示逻辑反转。注意，
        <code class="varname">Personality=</code> 
        的值
        对此选项
        
        没有任何影响。</p><p><code class="varname">ConditionVirtualization=</code>
        检测是否运行于(特定的)虚拟环境中：
        <code class="varname">yes</code>(某种虚拟环境),
        <code class="varname">no</code>(物理机),

        <code class="varname">vm</code>(某种虚拟机),
        <code class="varname">container</code>(某种容器),

        <code class="varname">qemu</code>,
        <code class="varname">kvm</code>,
        <code class="varname">zvm</code>,
        <code class="varname">vmware</code>,
        <code class="varname">microsoft</code>,
        <code class="varname">oracle</code>,
        <code class="varname">xen</code>,
        <code class="varname">bochs</code>,
        <code class="varname">uml</code>,
        <code class="varname">bhyve</code>,
        <code class="varname">qnx</code>,
        <code class="varname">openvz</code>,
        <code class="varname">lxc</code>,
        <code class="varname">lxc-libvirt</code>,
        <code class="varname">systemd-nspawn</code>,
        <code class="varname">docker</code>,
        <code class="varname">rkt</code>,

        <code class="varname">private-users</code>(用户名字空间)。参见
        <a href="systemd-detect-virt.html#"><span class="citerefentry"><span class="refentrytitle">systemd-detect-virt</span>(1)</span></a>
        手册以了解所有已知的虚拟化技术及其标识符。
        如果嵌套在多个虚拟化环境内，
        那么以最内层的那个为准。
        可以在这些关键字前面加上感叹号(!)前缀表示逻辑反转。</p><p><code class="varname">ConditionHost=</code>
        检测系统的 hostname 或者 "machine ID" 。
        参数可以是：(1)一个主机名字符串(可以使用 shell 风格的通配符)，
        该字符串将会与
        本机的主机名(也就是
        <a href="http://man7.org/linux/man-pages/man2/gethostname.2.html"><span class="citerefentry"><span class="refentrytitle">gethostname</span>(2)</span></a>
        的返回值)进行匹配；(2)或者是一个 "machine ID" 格式的字符串(参见
        <a href="machine-id.html#"><span class="citerefentry"><span class="refentrytitle">machine-id</span>(5)</span></a>
        手册)。
        可以在字符串前面加上感叹号(!)前缀表示逻辑反转。</p><p><code class="varname">ConditionKernelCommandLine=</code>
        检测是否设置了某个特定的内核引导选项。
        参数可以是一个单独的单词，也可以是一个 "<code class="literal">var=val</code>" 格式的赋值字符串。
        如果参数是一个单独的单词，那么以下两种情况都算是检测成功：
        (1)恰好存在一个完全匹配的单词选项；
        (2)在某个 "<code class="literal">var=val</code>" 格式的内核引导选项中等号前的 "<code class="literal">var</code>" 恰好与该单词完全匹配。
        如果参数是一个 "<code class="literal">var=val</code>" 格式的赋值字符串，
        那么必须恰好存在一个完全匹配的 "<code class="literal">var=val</code>" 格式的内核引导选项，才算检测成功。
        可以在字符串前面加上感叹号(!)前缀表示逻辑反转。</p><p><code class="varname">ConditionKernelVersion=</code> 检测内核版本(<span class="command"><strong>uname -r</strong></span>)
        是否匹配给定的表达式(或在字符串前面加上感叹号(!)前缀表示"不匹配")。
        表达式必须是一个单独的字符串。如果表达式以 "<code class="literal">&lt;</code>",
        "<code class="literal">&lt;=</code>", "<code class="literal">=</code>", "<code class="literal">&gt;=</code>", "<code class="literal">&gt;</code>" 之一开头，
        那么表示对内核版本号进行比较，否则表示按照 shell 风格的通配符表达式进行匹配。</p><p>注意，企图根据内核版本来判断内核支持哪些特性是不可靠的。
        因为发行版厂商经常将高版本内核的新驱动和新功能移植到当前发行版使用的低版本内核中，
        所以，对内核版本的检查是不能在不同发行版之间随意移植的，
        不应该用于需要跨发行版部署的单元。</p><p><code class="varname">ConditionSecurity=</code>
        检测是否启用了
        特定的安全技术：
        <code class="varname">selinux</code>, <code class="varname">apparmor</code>,
        <code class="varname">tomoyo</code>, <code class="varname">ima</code>,
        <code class="varname">smack</code>, <code class="varname">audit</code>,
        <code class="varname">uefi-secureboot</code> 。
        可以在这些关键字前面加上感叹号(!)前缀表示逻辑反转。</p><p><code class="varname">ConditionCapability=</code>
        检测 systemd 的 capability 
        集合中
        是否存在
        特定的
        <a href="http://man7.org/linux/man-pages/man7/capabilities.7.html"><span class="citerefentry"><span class="refentrytitle">capabilities</span>(7)</span></a> 。
        参数应设为例如 "<code class="literal">CAP_MKNOD</code>" 这样的 capability 名称。
        注意，此选项不是检测特定的 capability 是否实际可用，而是仅检测特定的 capability 在绑定集合中是否存在。
        可以在名称前面加上感叹号(!)前缀表示逻辑反转。</p><p><code class="varname">ConditionACPower=</code>
        检测系统是否
        正在使用交流电源。
        <code class="varname">yes</code>
        表示至少在使用一个交流电源，
        或者更本不存在任何交流电源。
        <code class="varname">no</code>
        表示存在交流电源，
        但是
        没有使用其中的任何一个。</p><p><code class="varname">ConditionNeedsUpdate=</code> 可设为
        <code class="filename">/var</code> 或 <code class="filename">/etc</code> 之一，
        用于检测指定的目录是否需要更新。
        设为 <code class="filename">/var</code> 表示
        检测 <code class="filename">/usr</code> 目录的最后更新时间(mtime)
        是否比 <code class="filename">/var/.updated</code> 文件的最后更新时间(mtime)更晚。
        设为 <code class="filename">/etc</code> 表示
        检测 <code class="filename">/usr</code> 目录的最后更新时间(mtime)
        是否比 <code class="filename">/etc/.updated</code> 文件的最后更新时间(mtime)更晚。
        可以在值前面加上感叹号(!)前缀表示逻辑反转。
        当更新了 <code class="filename">/usr</code> 中的资源之后，可以通过使用此选项，
        实现在下一次启动时更新 <code class="filename">/etc</code> 或 <code class="filename">/var</code> 目录的目的。
        使用此选项的单元必须设置 <code class="varname">ConditionFirstBoot=systemd-update-done.service</code> ，
        以确保在 <code class="filename">.updated</code> 文件被更新之前启动完毕。
        参见 <a href="systemd-update-done.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd-update-done.service</span>(8)</span></a> 
        手册。</p><p><code class="varname">ConditionFirstBoot=</code>
        可设为 <code class="varname">yes</code> 或 <code class="varname">no</code> 。
        用于检测 <code class="filename">/etc</code> 目录是否处于未初始化的原始状态(重点是 <code class="filename">/etc/machine-id</code> 文件是否存在)。
        此选项可用于系统出厂后(或者恢复出厂设置之后)，
        首次开机时执行必要的初始化操作。</p><p><code class="varname">ConditionPathExists=</code>
        检测
        指定的路径
        是否存在，
        必须使用绝对路径。
        可以在路径前面
        加上感叹号(!)前缀
        表示逻辑反转。</p><p><code class="varname">ConditionPathExistsGlob=</code> 
        与 <code class="varname">ConditionPathExists=</code> 类似，
        唯一的不同是支持
         shell 通配符。</p><p><code class="varname">ConditionPathIsDirectory=</code>
        检测指定的路径是否存在并且是一个目录，必须使用绝对路径。
        可以在路径前面加上感叹号(!)前缀表示逻辑反转。</p><p><code class="varname">ConditionPathIsSymbolicLink=</code>
        检测指定的路径是否存在并且是一个软连接，必须使用绝对路径。
        可以在路径前面加上感叹号(!)前缀
        表示逻辑反转。</p><p><code class="varname">ConditionPathIsMountPoint=</code>
        检测指定的路径是否存在并且是一个挂载点，必须使用绝对路径。
        可以在路径前面加上感叹号(!)前缀表示逻辑反转。</p><p><code class="varname">ConditionPathIsReadWrite=</code>
        检测指定的路径是否存在并且可读写(rw)，必须使用绝对路径。
        可以在路径前面加上感叹号(!)前缀
        表示逻辑反转。</p><p><code class="varname">ConditionDirectoryNotEmpty=</code>
        检测指定的路径是否存在并且是一个非空的目录，必须使用绝对路径。
        可以在路径前面加上感叹号(!)前缀
        表示逻辑反转。</p><p><code class="varname">ConditionFileNotEmpty=</code>
        检测指定的路径是否存在并且是一个非空的普通文件，必须使用绝对路径。
        可以在路径前面加上感叹号(!)前缀
        表示逻辑反转。</p><p><code class="varname">ConditionFileIsExecutable=</code>
        检测指定的路径是否存在并且是一个可执行文件，必须使用绝对路径。
        可以在路径前面加上感叹号(!)前缀
        表示逻辑反转。</p><p><code class="varname">ConditionUser=</code>
        检测 systemd 是否以给定的用户身份运行。
        参数可以是数字形式的 "<code class="literal">UID</code>" 、
        或者字符串形式的UNIX用户名、
        或者特殊值 "<code class="literal">@system</code>"(表示属于系统用户范围内) 。
        此选项对于系统服务无效，
        因为管理系统服务的 systemd 进程
        总是以 root 用户身份运行。</p><p><code class="varname">ConditionGroup=</code>
        检测 systemd 是否以给定的用户组身份运行。
        参数可以是数字形式的 "<code class="literal">GID</code>" 或者字符串形式的UNIX组名。
        注意：(1)这里所说的"组"可以是"主组"(Primary Group)、"有效组"(Effective Group)、"辅助组"(Auxiliary Group)；
        (2)此选项不存在特殊值 "<code class="literal">@system</code>"</p><p><code class="varname">ConditionControlGroupController=</code>
        检测给定的一组 cgroup 控制器(例如 <code class="option">cpu</code>)是否全部可用。
        通过例如
        <code class="varname">cgroup_disable=controller</code>
        这样的内核命令行可以禁用名为"controller"的 cgroup 控制器。
        列表中的多个 cgroup 控制器之间可以使用空格分隔。
        不能识别的 cgroup 控制器将被忽略。
        能够识别的全部 cgroup 控制器如下：
        <code class="option">cpu</code>, <code class="option">cpuacct</code>, <code class="option">io</code>,
        <code class="option">blkio</code>, <code class="option">memory</code>,
        <code class="option">devices</code>, <code class="option">pids</code></p><p>如果在条件之前加上管道符(|)，那么这个条件就是"触发条件"，
        其含义是只要满足一个触发条件，该单元就会被启动；
        如果在条件之前没有管道符(|)，那么这个条件就是"普通条件"，
        其含义是必须满足全部普通条件，该单元才会被启动。
        如果在某个单元文件内，
        同时存在"触发条件"与"普通条件"，那么必须满足全部普通条件，
        并且至少满足一个触发条件，该单元才会被启动。
        如果需要对某个条件同时使用"|"与"!"，
        那么"|"必须位于"!"之前。
        除 
        <code class="varname">ConditionPathIsSymbolicLink=</code> 之外，
        其他路径检测选项都会追踪软连接。
        如果将上述某个检测选项设为空字符串，
        那么表示重置该选项先前的所有设置，
        也就是清空该选项先前的设置。</p></dd><dt id="AssertArchitecture="><span class="term"><code class="varname">AssertArchitecture=</code>, </span><span class="term"><code class="varname">AssertVirtualization=</code>, </span><span class="term"><code class="varname">AssertHost=</code>, </span><span class="term"><code class="varname">AssertKernelCommandLine=</code>, </span><span class="term"><code class="varname">AssertKernelVersion=</code>, </span><span class="term"><code class="varname">AssertSecurity=</code>, </span><span class="term"><code class="varname">AssertCapability=</code>, </span><span class="term"><code class="varname">AssertACPower=</code>, </span><span class="term"><code class="varname">AssertNeedsUpdate=</code>, </span><span class="term"><code class="varname">AssertFirstBoot=</code>, </span><span class="term"><code class="varname">AssertPathExists=</code>, </span><span class="term"><code class="varname">AssertPathExistsGlob=</code>, </span><span class="term"><code class="varname">AssertPathIsDirectory=</code>, </span><span class="term"><code class="varname">AssertPathIsSymbolicLink=</code>, </span><span class="term"><code class="varname">AssertPathIsMountPoint=</code>, </span><span class="term"><code class="varname">AssertPathIsReadWrite=</code>, </span><span class="term"><code class="varname">AssertDirectoryNotEmpty=</code>, </span><span class="term"><code class="varname">AssertFileNotEmpty=</code>, </span><span class="term"><code class="varname">AssertFileIsExecutable=</code>, </span><span class="term"><code class="varname">AssertUser=</code>, </span><span class="term"><code class="varname">AssertGroup=</code>, </span><span class="term"><code class="varname">AssertControlGroupController=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#AssertArchitecture=">¶</a></dt><dd><p>与前一组 <code class="varname">ConditionArchitecture=</code>,
        <code class="varname">ConditionVirtualization=</code>, … 测试选项类似，这一组选项用于在单元启动之前，
        首先进行相应的断言检查。不同之处在于，任意一个断言的失败，
        都会导致跳过该单元的启动并将失败的断言突出记录在日志中。
        注意，断言失败并不导致该单元进入失败("<code class="literal">failed</code>")状态(实际上，该单元的状态不会发生任何变化)，
        它仅影响该单元的启动任务队列。
        如果用户希望清晰的看到某些单元因为未能满足特定的条件而导致没有正常启动，
        那么可以使用断言表达式。</p><p>注意，无论是前一组条件表达式、还是这一组断言表达式，都不会改变单元的状态。
        因为这两组表达式都是在启动任务队列开始执行时进行检查(也就是，位于依赖任务队列之后、该单元自身启动任务队列之前)，
        所以，条件表达式和断言表达式
        都不适合用于对单元的依赖条件进行检查。</p></dd><dt id="SourcePath="><span class="term"><code class="varname">SourcePath=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#SourcePath=">¶</a></dt><dd><p>指定
        生成此单元时所参考的配置文件。
        仅用于单元生成器
        标识此单元生成自何处。
        普通的单元
        不应该使用它。</p></dd></dl></div></div><div class="refsect1"><a name="id-1.11"></a><h2 id="单元属性的正反对应">单元属性的正反对应<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%E5%8D%95%E5%85%83%E5%B1%9E%E6%80%A7%E7%9A%84%E6%AD%A3%E5%8F%8D%E5%AF%B9%E5%BA%94">¶</a></h2><p>那些与其他单元关联的属性
    通常同时显示(<span class="command"><strong>systemctl show</strong></span>)在两个关联单元的属性中。
    多数情况下，
    属性的名称就是单元配置选项的名称，但并不总是如此。
    下表展示了存在依赖关系的两个单元的属性是如何显示的，
    同时也展示了"源"单元的属性与"目标"单元的属性之间的对应关系。
    </p><div class="table"><a name="id-1.11.3"></a><p class="title"><b>表 3. 
        "正向"与"反向"单元属性
      </b></p><div class="table-contents"><table class="table" summary='
        "正向"与"反向"单元属性
      ' border="1"><colgroup><col class="forward"><col class="reverse"></colgroup><thead><tr><th>"正向"属性</th><th>"反向"属性</th><th>用于何处</th></tr></thead><tbody><tr><td><code class="varname">Before=</code></td><td><code class="varname">After=</code></td><td rowspan="2" valign="middle">[Unit] 小节</td></tr><tr><td><code class="varname">After=</code></td><td><code class="varname">Before=</code></td></tr><tr><td><code class="varname">Requires=</code></td><td><code class="varname">RequiredBy=</code></td><td>[Unit] 小节； [Install] 小节</td></tr><tr><td><code class="varname">Wants=</code></td><td><code class="varname">WantedBy=</code></td><td>[Unit] 小节； [Install] 小节</td></tr><tr><td><code class="varname">PartOf=</code></td><td><code class="varname">ConsistsOf=</code></td><td>[Unit] 小节； 自动生成</td></tr><tr><td><code class="varname">BindsTo=</code></td><td><code class="varname">BoundBy=</code></td><td>[Unit] 小节； 自动生成</td></tr><tr><td><code class="varname">Requisite=</code></td><td><code class="varname">RequisiteOf=</code></td><td>[Unit] 小节； 自动生成</td></tr><tr><td><code class="varname">Triggers=</code></td><td><code class="varname">TriggeredBy=</code></td><td>自动生成(参见下文的解释)</td></tr><tr><td><code class="varname">Conflicts=</code></td><td><code class="varname">ConflictedBy=</code></td><td>[Unit] 小节； 自动生成</td></tr><tr><td><code class="varname">PropagatesReloadTo=</code></td><td><code class="varname">ReloadPropagatedFrom=</code></td><td rowspan="2" valign="middle">[Unit] 小节</td></tr><tr><td><code class="varname">ReloadPropagatedFrom=</code></td><td><code class="varname">PropagatesReloadTo=</code></td></tr><tr><td><code class="varname">Following=</code></td><td>n/a</td><td>自动生成</td></tr></tbody></table></div></div><br class="table-break"><p><code class="varname">WantedBy=</code> 与 <code class="varname">RequiredBy=</code>
    位于 [Install] 小节，仅用于在 <code class="filename">.wants/</code>
    与 <code class="filename">.requires/</code> 目录中创建软连接，
    不能直接用作单元属性。</p><p><code class="varname">ConsistsOf=</code>, <code class="varname">BoundBy=</code>,
    <code class="varname">RequisiteOf=</code>, <code class="varname">ConflictedBy=</code>
    只能由对应的"正向"属性自动隐式创建，而不能直接在单元文件中设置。</p><p><code class="varname">Triggers=</code> 只能隐式的创建于 socket,
    path, automount 单元之中。
    默认触发对应的同名单元，但是可以通过
    <code class="varname">Sockets=</code>, <code class="varname">Service=</code>, <code class="varname">Unit=</code>
    选项进行改写。详见
    <a href="systemd.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd.service</span>(5)</span></a>,
    <a href="systemd.socket.html#"><span class="citerefentry"><span class="refentrytitle">systemd.socket</span>(5)</span></a>,
    <a href="systemd.path.html#"><span class="citerefentry"><span class="refentrytitle">systemd.path</span>(5)</span></a>,

    <a href="systemd.automount.html#"><span class="citerefentry"><span class="refentrytitle">systemd.automount</span>(5)</span></a>
    手册。<code class="varname">TriggeredBy=</code> 
    只能隐式的创建于被触发的单元之中。</p><p><code class="varname">Following=</code> 用于汇聚设备别名，
    并指向用于跟踪设备状态的"主"设备单元，通常对应到一个 sysfs 文件系统路径。
    它并不会显示在"目标"单元中。</p></div><div class="refsect1"><a name="id-1.12"></a><h2 id="[Install] 小节选项">[Install] 小节选项<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%5BInstall%5D%20%E5%B0%8F%E8%8A%82%E9%80%89%E9%A1%B9">¶</a></h2><p> "<code class="literal">[Install]</code>" 小节包含单元的启用信息。
    事实上，<a href="systemd.html#"><span class="citerefentry"><span class="refentrytitle">systemd</span>(1)</span></a> 在运行时并不使用此小节。
    只有 <a href="systemctl.html#"><span class="citerefentry"><span class="refentrytitle">systemctl</span>(1)</span></a>
    的 <span class="command"><strong>enable</strong></span> 与 <span class="command"><strong>disable</strong></span> 命令在启用/停用单元时才会使用此小节。
    [译者注]"启用"一个单元多数时候在效果上相当于将这个单元设为"开机时自动启动"或"插入某个硬件时自动启动"；
    "停用"一个单元多数时候在效果上相当于撤销该单元的"开机时自动启动"或"插入某个硬件时自动启动"。</p><div class="variablelist"><dl class="variablelist"><dt id="Alias="><span class="term"><code class="varname">Alias=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#Alias=">¶</a></dt><dd><p>启用时使用的别名，可以设为一个空格分隔的别名列表。
        每个别名的后缀(也就是单元类型)都必须与该单元自身的后缀相同。
        如果多次使用此选项，那么每个选项所设置的别名都会被添加到别名列表中。
        在启用此单元时，<span class="command"><strong>systemctl enable</strong></span> 命令将会为每个别名创建一个指向该单元文件的软连接。
        注意，因为 mount, slice, swap, automount 单元不支持别名，
        所以不要在这些类型的单元中使用此选项。</p></dd><dt id="WantedBy="><span class="term"><code class="varname">WantedBy=</code>, </span><span class="term"><code class="varname">RequiredBy=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#WantedBy=">¶</a></dt><dd><p>接受一个空格分隔的单元列表，
        表示在使用 <span class="command"><strong>systemctl enable</strong></span> 启用此单元时，
        将会在每个列表单元的
        <code class="filename">.wants/</code> 或 <code class="filename">.requires/</code>
        目录中创建一个指向该单元文件的软连接。
        这相当于为每个列表中的单元文件添加了
        <code class="varname">Wants=此单元</code> 或 <code class="varname">Requires=此单元</code> 选项。
        这样当列表中的任意一个单元启动时，该单元都会被启动。
        有关 <code class="varname">Wants=</code> 与 <code class="varname">Requires=</code> 的详细说明，
        参见前面 [Unit] 小节的说明。
        如果多次使用此选项，
        那么每个选项的单元列表都会合并在一起。</p><p>在普通的
        <code class="filename">bar.service</code> 单元内设置 <span class="command"><strong>WantedBy=foo.service</strong></span> 选项
        与设置 <span class="command"><strong>Alias=foo.service.wants/bar.service</strong></span> 选项基本上是等价的。
        但是对于模板单元来说，情况则有所不同。
        虽然必须使用实例名称调用 <span class="command"><strong>systemctl enable</strong></span> 命令，
        但是实际上添加到
        <code class="filename">.wants/</code> 或
        <code class="filename">.requires/</code> 目录中的软连接，
        指向的却是模板单元(因为并不存在真正的单元实例文件)。
        假设 <code class="filename">getty@.service</code> 文件中存在 <span class="command"><strong>WantedBy=getty.target</strong></span> 选项，那么 
        <span class="command"><strong>systemctl enable getty@tty2.service</strong></span>
        命令将会创建一个
        <code class="filename">getty.target.wants/getty@tty2.service</code>
        软连接(指向 <code class="filename">getty@.service</code>)
        </p></dd><dt id="Also="><span class="term"><code class="varname">Also=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#Also=">¶</a></dt><dd><p>设置此单元的附属单元，
        可以设为一个空格分隔的单元列表。
        表示当使用 <span class="command"><strong>systemctl enable</strong></span> 启用
        或 <span class="command"><strong>systemctl disable</strong></span> 停用
        此单元时，
        也同时自动的启用或停用附属单元。</p><p>如果多次使用此选项，
        那么每个选项所设置的附属单元列表
        都会合并在一起。</p></dd><dt id="DefaultInstance="><span class="term"><code class="varname">DefaultInstance=</code></span><a class="headerlink" title="Permalink to this term" href="systemd.unit.html#DefaultInstance=">¶</a></dt><dd><p>仅对模板单元有意义，
        用于指定默认的实例名称。
        如果启用此单元时没有指定实例名称，
        那么
        将使用这里设置的名称。</p></dd></dl></div><p>在 [Install] 小节的选项中，可以使用如下替换符：
     %n, %N, %p, %i, %j, %g, %G, %U, %u, %m, %H, %b, %v 。
    每个符号的具体含义详见下一小节。
    </p></div><div class="refsect1"><a name="id-1.13"></a><h2 id="替换符">替换符<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%E6%9B%BF%E6%8D%A2%E7%AC%A6">¶</a></h2><p>在许多选项中都可以使用一些替换符(不只是 [Install] 小节中的选项)，
    以引用一些运行时才能确定的值，
    从而可以写出更通用的单元文件。
    替换符必须是已知的、并且是可以解析的，这样设置才能生效。
    当前可识别的所有替换符及其解释如下：</p><div class="table"><a name="id-1.13.3"></a><p class="title"><b>表 4. 可以用在单元文件中的替换符</b></p><div class="table-contents"><table class="table" summary="可以用在单元文件中的替换符" border="1"><colgroup><col align="left" class="spec"><col align="left" class="mean"></colgroup><thead><tr><th align="left">替换符</th><th align="left">含义</th></tr></thead><tbody><tr><td align="left">"<code class="literal">%b</code>"</td><td align="left">系统的"Boot ID"字符串。参见 <a href="http://man7.org/linux/man-pages/man4/random.4.html"><span class="citerefentry"><span class="refentrytitle">random</span>(4)</span></a> 手册</td></tr><tr><td align="left">"<code class="literal">%C</code>"</td><td align="left">缓存根目录。对于系统实例来说是 <code class="filename">/var/cache</code> ；对于用户实例来说是 "<code class="literal">$XDG_CACHE_HOME</code>"</td></tr><tr><td align="left">"<code class="literal">%E</code>"</td><td align="left">配置根目录。对于系统实例来说是 <code class="filename">/etc</code> ；对于用户实例来说是 "<code class="literal">$XDG_CONFIG_HOME</code>"</td></tr><tr><td align="left">"<code class="literal">%f</code>"</td><td align="left">原始单元文件名称(不含路径，且遵守前文描述的已转义绝对文件系统路径的还原规则)。对于实例化的单元，就是带有 <code class="filename">/</code> 前缀的原始实例名；对于其他单元，就是带有 <code class="filename">/</code> 前缀的原始前缀名。</td></tr><tr><td align="left">"<code class="literal">%h</code>"</td><td align="left">用户的家目录。运行 systemd 实例的用户的家目录，对于系统实例则是 "<code class="literal">/root</code>"</td></tr><tr><td align="left">"<code class="literal">%H</code>"</td><td align="left">系统的主机名(hostname)</td></tr><tr><td align="left">"<code class="literal">%i</code>"</td><td align="left">已转义的实例名称。对于实例化单元，就是 "<code class="literal">@</code>" 和后缀之间的部分。对于非实例化单元则为空。</td></tr><tr><td align="left">"<code class="literal">%I</code>"</td><td align="left">原始实例名称。对于实例化单元，就是 "<code class="literal">@</code>" 和后缀之间的部分(已还原的)。对于非实例化单元则为空。</td></tr><tr><td align="left">"<code class="literal">%j</code>"</td><td align="left">已转义的前缀名最后一部分。也就是前缀名中最后一个 "<code class="literal">-</code>" 之后的部分。如果没有 "<code class="literal">-</code>" 那么与 "<code class="literal">%p</code>" 相同。</td></tr><tr><td align="left">"<code class="literal">%J</code>"</td><td align="left">原始前缀名最后一部分。也就是前缀名中最后一个 "<code class="literal">-</code>" 之后的部分(已还原的)。如果没有 "<code class="literal">-</code>" 那么与 "<code class="literal">%p</code>" 相同。</td></tr><tr><td align="left">"<code class="literal">%L</code>"</td><td align="left">日志根目录。对于系统实例来说是 <code class="filename">/var/log</code> ；对于用户实例来说是 "<code class="literal">$XDG_CONFIG_HOME</code>"<code class="filename">/log</code></td></tr><tr><td align="left">"<code class="literal">%m</code>"</td><td align="left">系统的"Machine ID"字符串。参见 <a href="machine-id.html#"><span class="citerefentry"><span class="refentrytitle">machine-id</span>(5)</span></a> 手册</td></tr><tr><td align="left">"<code class="literal">%n</code>"</td><td align="left">带类型后缀的完整单元名称</td></tr><tr><td align="left">"<code class="literal">%N</code>"</td><td align="left">无类型后缀的完整单元名称</td></tr><tr><td align="left">"<code class="literal">%p</code>"</td><td align="left">已转义的前缀名称。对于实例化单元来说，就是单元名称里第一个 "<code class="literal">@</code>" 之前的字符串。对于非实例化单元来说，等价于 "<code class="literal">%N</code>"</td></tr><tr><td align="left">"<code class="literal">%P</code>"</td><td align="left">原始前缀名称。对于实例化单元来说，就是单元名称里第一个 "<code class="literal">@</code>" 之前的字符串(已还原的)。对于非实例化单元来说，等价于 "<code class="literal">%N</code>"</td></tr><tr><td align="left">"<code class="literal">%s</code>"</td><td align="left">用户的shell。运行 systemd 实例的用户的shell，对于系统实例则是 "<code class="literal">/bin/sh</code>"</td></tr><tr><td align="left">"<code class="literal">%S</code>"</td><td align="left">状态根目录。对于系统实例来说是 <code class="filename">/var/lib</code> ；对于用户实例来说是 "<code class="literal">$XDG_CONFIG_HOME</code>"</td></tr><tr><td align="left">"<code class="literal">%t</code>"</td><td align="left">运行时根目录。对于系统实例来说是 <code class="filename">/run</code> ；对于用户实例来说是 "<code class="literal">$XDG_RUNTIME_DIR</code>"</td></tr><tr><td align="left">"<code class="literal">%T</code>"</td><td align="left">临时文件目录。也就是 <code class="filename">/tmp</code> 或 "<code class="literal">$TMPDIR</code>", "<code class="literal">$TEMP</code>", "<code class="literal">$TMP</code>" 之一(若已设置)</td></tr><tr><td align="left">"<code class="literal">%g</code>"</td><td align="left">运行 systemd 用户实例的组名称。对于 systemd 系统实例来说，则是 "<code class="literal">root</code>"</td></tr><tr><td align="left">"<code class="literal">%G</code>"</td><td align="left">运行 systemd 用户实例的组GID。对于 systemd 系统实例来说，则是 "<code class="literal">0</code>"</td></tr><tr><td align="left">"<code class="literal">%u</code>"</td><td align="left">运行 systemd 用户实例的用户名称。对于 systemd 系统实例来说，则是 "<code class="literal">root</code>"</td></tr><tr><td align="left">"<code class="literal">%U</code>"</td><td align="left">运行 systemd 用户实例的用户UID。对于 systemd 系统实例来说，则是 "<code class="literal">0</code>"</td></tr><tr><td align="left">"<code class="literal">%v</code>"</td><td align="left">内核版本(<span class="command"><strong>uname -r</strong></span> 的输出)</td></tr><tr><td align="left">"<code class="literal">%V</code>"</td><td align="left">存放大体积临时文件以及持久临时文件的目录。也就是 <code class="filename">/var/tmp</code> 或 "<code class="literal">$TMPDIR</code>", "<code class="literal">$TEMP</code>", "<code class="literal">$TMP</code>" 之一(若已设置)</td></tr><tr><td align="left">"<code class="literal">%%</code>"</td><td align="left">百分号自身(%)。使用 "<code class="literal">%%</code>" 表示一个真正的 "<code class="literal">%</code>" 字符。</td></tr></tbody></table></div></div><br class="table-break"></div><div class="refsect1"><a name="id-1.14"></a><h2 id="例子">例子<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%E4%BE%8B%E5%AD%90">¶</a></h2><div class="example"><a name="id-1.14.2"></a><p class="title"><b>例 1. 允许单元被启用</b></p><div class="example-contents"><p>下面这个 <code class="filename">foo.service</code> 单元中的
       [Install] 小节表明该单元可以通过
      <span class="command"><strong>systemctl enable</strong></span> 命令启用。</p><pre class="programlisting">[Unit]
Description=Foo

[Service]
ExecStart=/usr/sbin/foo-daemon

<span class="emphasis"><em>[Install]</em></span>
<span class="emphasis"><em>WantedBy=multi-user.target</em></span></pre><p>执行 <span class="command"><strong>systemctl enable</strong></span> 启用命令之后，
      将会建立一个指向该单元文件的软链接
      <code class="filename">/etc/systemd/system/multi-user.target.wants/foo.service</code> ，
      表示将  <code class="filename">foo.service</code> 包含到 <code class="filename">multi-user.target</code> 目标中，
      这样，当启动 <code class="filename">multi-user.target</code> 目标时，
      将会自动起动 <code class="filename">foo.service</code> 服务。
      同时，<span class="command"><strong>systemctl disable</strong></span> 命令
      将会删除这个软连接。</p></div></div><br class="example-break"><div class="example"><a name="id-1.14.3"></a><p class="title"><b>例 2. 覆盖软件包的默认设置</b></p><div class="example-contents"><p>以例如
       <code class="filename">foo.type</code>
      这样的系统单元为例，
      有两种修改单元文件的方法：
      (1)将单元文件从 <code class="filename">/usr/lib/systemd/system</code> 目录
      复制到 <code class="filename">/etc/systemd/system</code> 目录中，
      然后直接修改复制后的副本。
      (2)创建 <code class="filename">/etc/systemd/system/foo.type.d/</code> 目录，
      并在其中创建一些 <code class="filename"><em class="replaceable"><code>name</code></em>.conf</code> 文件，
      然后
      仅针对性的修改某些个别选项。</p><p>第一种方法的优点是易于修改整个单元，
      因为原有的单元文件会被完全忽略。
      但此种方法的缺点是，
      当原有的单元文件被更新时，
      变更不能在修改后的副本上自动体现出来。</p><p>第二种方法的优点是仅需修改个别选项，
      并且原有单元文件的更新能够自动生效。
      因为 <code class="filename">.conf</code> 文件只会按照其文件名的字典顺序，被依次追加到原有单元文件的尾部。
      但此种方法的缺点是原有单元文件的更新
      有可能导致与 <code class="filename">.conf</code> 文件中的设置不兼容。</p><p>这同样适用于 systemd 用户实例，
      只是用户单元文件的文件系统位置不同而已。
      参见前文的"单元目录"小节。</p><p>下面是一个实例，假定原有的单元文件
      <code class="filename">/usr/lib/systemd/system/httpd.service</code>
      包含以下内容：</p><pre class="programlisting">[Unit]
Description=Some HTTP server
After=remote-fs.target sqldb.service
Requires=sqldb.service
AssertPathExists=/srv/webserver

[Service]
Type=notify
ExecStart=/usr/sbin/some-fancy-httpd-server
Nice=5

[Install]
WantedBy=multi-user.target</pre><p>假定系统管理员想要修改几个设置：
      (1)本地并不存在 <code class="filename">/srv/webserver</code>
       目录，需要修改为
      <code class="filename">/srv/www</code> 目录。
      (2)让此服务依赖于本地已经存在的
       <code class="filename">memcached.service</code> 
      服务(<code class="varname">Requires=</code>)，
      且在其后启动(<code class="varname">After=</code>)。
      (3)为了加固此服务，
      添加一个 <code class="varname">PrivateTmp=</code> 设置(参见
      <a href="systemd.exec.html#"><span class="citerefentry"><span class="refentrytitle">systemd.exec</span>(5)</span></a>
      手册)。
      (4)将此服务的进程谦让值重置为默认值"0"。</p><p>第一种方法，将原有的单元文件复制到
      <code class="filename">/etc/systemd/system/httpd.service</code>
      并做相应的修改：</p><pre class="programlisting">[Unit]
Description=Some HTTP server
After=remote-fs.target sqldb.service <span class="emphasis"><em>memcached.service</em></span>
Requires=sqldb.service <span class="emphasis"><em>memcached.service</em></span>
AssertPathExists=<span class="emphasis"><em>/srv/www</em></span>

[Service]
Type=notify
ExecStart=/usr/sbin/some-fancy-httpd-server
<span class="emphasis"><em>Nice=0</em></span>
<span class="emphasis"><em>PrivateTmp=yes</em></span>

[Install]
WantedBy=multi-user.target</pre><p>第二种方法，
      创建配置片段
      <code class="filename">/etc/systemd/system/httpd.service.d/local.conf</code>
      并在其中填入如下内容：</p><pre class="programlisting">[Unit]
After=memcached.service
Requires=memcached.service
# 重置所有断言，接着重新加入想要的条件
AssertPathExists=
AssertPathExists=/srv/www

[Service]
Nice=0
PrivateTmp=yes</pre><p>注意，
      对于单元配置片段，
      如果想要移除列表选项(例如 <code class="varname">AssertPathExists=</code>
      或 <code class="varname">ExecStart=</code>)中的某些项，
      那么必须首先清空列表(设为空)，然后才能添加(剔除掉某些项之后)剩余的列表项。
      注意，因为依赖关系列表(<code class="varname">After=</code> 之类)不能被重置为空，所以：
      (1)在配置片段(<code class="filename">.conf</code>)中只能添加依赖关系；
      (2)如果你想移除现有的依赖关系，并重新设定，
      那么只能用第一种方法(先复制，然后直接修改复制后的副本)。</p></div></div><br class="example-break"></div><div class="refsect1"><a name="id-1.15"></a><h2 id="参见">参见<a class="headerlink" title="Permalink to this headline" href="systemd.unit.html#%E5%8F%82%E8%A7%81">¶</a></h2><p>
      <a href="systemd.html#"><span class="citerefentry"><span class="refentrytitle">systemd</span>(1)</span></a>,
      <a href="systemctl.html#"><span class="citerefentry"><span class="refentrytitle">systemctl</span>(1)</span></a>,
      <a href="systemd-system.conf.html#"><span class="citerefentry"><span class="refentrytitle">systemd-system.conf</span>(5)</span></a>,
      <a href="systemd.special.html#"><span class="citerefentry"><span class="refentrytitle">systemd.special</span>(7)</span></a>,
      <a href="systemd.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd.service</span>(5)</span></a>,
      <a href="systemd.socket.html#"><span class="citerefentry"><span class="refentrytitle">systemd.socket</span>(5)</span></a>,
      <a href="systemd.device.html#"><span class="citerefentry"><span class="refentrytitle">systemd.device</span>(5)</span></a>,
      <a href="systemd.mount.html#"><span class="citerefentry"><span class="refentrytitle">systemd.mount</span>(5)</span></a>,
      <a href="systemd.automount.html#"><span class="citerefentry"><span class="refentrytitle">systemd.automount</span>(5)</span></a>,
      <a href="systemd.swap.html#"><span class="citerefentry"><span class="refentrytitle">systemd.swap</span>(5)</span></a>,
      <a href="systemd.target.html#"><span class="citerefentry"><span class="refentrytitle">systemd.target</span>(5)</span></a>,
      <a href="systemd.path.html#"><span class="citerefentry"><span class="refentrytitle">systemd.path</span>(5)</span></a>,
      <a href="systemd.timer.html#"><span class="citerefentry"><span class="refentrytitle">systemd.timer</span>(5)</span></a>,
      <a href="systemd.scope.html#"><span class="citerefentry"><span class="refentrytitle">systemd.scope</span>(5)</span></a>,
      <a href="systemd.slice.html#"><span class="citerefentry"><span class="refentrytitle">systemd.slice</span>(5)</span></a>,
      <a href="systemd.time.html#"><span class="citerefentry"><span class="refentrytitle">systemd.time</span>(7)</span></a>,
      <a href="systemd-analyze.html#"><span class="citerefentry"><span class="refentrytitle">systemd-analyze</span>(1)</span></a>,
      <a href="http://man7.org/linux/man-pages/man7/capabilities.7.html"><span class="citerefentry"><span class="refentrytitle">capabilities</span>(7)</span></a>,
      <a href="systemd.directives.html#"><span class="citerefentry"><span class="refentrytitle">systemd.directives</span>(7)</span></a>,
      <a href="http://man7.org/linux/man-pages/man1/uname.1.html"><span class="citerefentry"><span class="refentrytitle">uname</span>(1)</span></a>
    </p></div></div></body></html>
